[UWP]使用Picker实现一个简单的ColorPicker弹窗

[UWP]使用Picker实现一个简单的ColorPicker弹窗
原文:[UWP]使用Picker实现一个简单的ColorPicker弹窗

在上一篇博文《[UWP]使用Popup构建UWP Picker》中我们简单讲述了一下使用Popup构建适用于MVVM框架下的弹窗层组件Picker的过程。但是没有应用实例的话可能体现不出Picker相对于ContentDialog的优点在哪里,毕竟Linus大神说过:

Talk is cheap, show me the code!

我们假定要实现这样一个颜色选择器:当用户需要选择一个颜色时,应用弹出颜色选择器,用户选择完成后,点击“确定”按钮关闭弹窗,并且向调用方代码返回用户选择的颜色值。

它的调用界面是这样的:

ColorPicker

编写ColorPicker弹窗的业务逻辑代码

上篇博文里我们讲到要实现Picker功能,其ViewModel必须实现IObjectPicker

IObjectPicker

public interface IObjectPicker<T>
{event EventHandler<ObjectPickedEventArgs<T>> ObjectPicked;event EventHandler Canceled;
}

ObjectPickerBase

public abstract class ObjectPickerBase<T> : ViewModelBase, IObjectPicker<T>
{public event EventHandler<ObjectPickedEventArgs<T>> ObjectPicked;public event EventHandler Canceled;/// <summary>/// 设置选择的对象/// </summary>/// <param name="result"></param>public void SetResult(T result){ObjectPicked?.Invoke(this, new ObjectPickedEventArgs<T>(result));}/// <summary>/// 取消Pick操作/// </summary>public void Exit(){Canceled?.Invoke(this, EventArgs.Empty);}public RelayCommand ExitCommand => new RelayCommand(Exit);
}

这里我们编写一个TestColorPickerViewModel作为ColorPicker弹窗界面的ViewModel,其代码如下:

    public class TestColorPickerViewModel: ObjectPickerBase<Color>{private Color _pickedColor;public Color PickedColor{get => _pickedColor;set => Set(ref _pickedColor, value);}public override void OnNavigatedTo(NavigationEventArgs e){if (e.Parameter is Color color){PickedColor = color;}base.OnNavigatedTo(e);}public ICommand PickColorCommand => new RelayCommand(() =>{SetResult(PickedColor);});}

其中有一个重载的方法OnNavigatedTo,这个用于接受打开弹窗时给传递给Picker的参数,这个属于HHChaosToolkit类库中MVVM导航服务的一部分功能,以后的博客我可能会拿出来单独讲一下。

我们看到,TestColorPickerViewModel的代码逻辑非常简单,在执行PickColorCommand后返回PickedColor作为结果。

编写ColorPicker的UI层代码

View层交互不多,我们新建一个Page,然后添加一个ColorPicker控件,Color属性绑定ViewModel的PickedColor,添加一个“确定”按钮绑定PickColorCommand,xaml.cs文件中无需添加任何代码,xaml代码如下:

<Pagex:Class="HHChaosToolkit.Sample.Views.TestPages.TestColorPickerPage"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="using:HHChaosToolkit.Sample.Views.TestPages"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"mc:Ignorable="d"DataContext="{Binding TestColorPickerViewModel, Source={StaticResource Locator}}"Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"><Grid><Grid Background="White" BorderBrush="#d9ddea" BorderThickness="1"><Grid.RowDefinitions><RowDefinition Height="Auto" /><RowDefinition /><RowDefinition Height="Auto" /></Grid.RowDefinitions><Grid Height="40" Background="#d9ddea"><Grid.ColumnDefinitions><ColumnDefinition /><ColumnDefinition Width="auto" /></Grid.ColumnDefinitions><TextBlockMargin="15,0"VerticalAlignment="Center"FontSize="14px"Foreground="#474261"Text="ColorPicker" /><ButtonGrid.Column="1"Command="{Binding ExitCommand}"Style="{StaticResource PickerCloseButtonStyle}" /></Grid><Grid Grid.Row="1" Padding="20,10"><ColorPicker x:Name="ColorPicker" Color="{Binding PickedColor,Mode=TwoWay}"/></Grid><Grid Grid.Row="2" Padding="20"><Button HorizontalAlignment="Center" Content="确定" Command="{Binding PickColorCommand}"/></Grid></Grid></Grid>
</Page>

注册调用过程

注册ColorPicker弹窗

我们首先要在ViewModelLocator中注册TestColorPickerViewModel为可选取Color类型的Picker对象,代码如下:

RegisterObjectPicker<Color, TestColorPickerViewModel, TestColorPickerPage>();

其中RegisterObjectPicker方法的源码如下:

    public void RegisterObjectPicker<T, VM, V>()where VM : ObjectPickerBase<T>{SimpleIoc.Default.Register<VM>();ObjectPickerService.Configure(typeof(T).FullName, typeof(VM).FullName, typeof(V));}

这段代码目的是在ObjectPickerService中注册TestColorPickerViewModel为可选取Color类型的Picker对象,这样我们之后的调用可以直接通过ObjectPickerService来进行。

必须要说明的是ObjectPickerService可以为同一类型注册多个Picker对象,类似于Windows系统中可安装多个视频播放器,调用时指定使用哪个播放器即可。

调用ColorPicker弹窗

在ObjectPickerService中注册过后,我们即可在任意需要选取颜色的地方使用我们的ColorPicker弹窗,最简单的调用方法时这样的:

        var pickerService = ServiceLocator.Current.GetInstance<ObjectPickerService>();var ret = await pickerService.PickSingleObjectAsync<Color>(typeof(TestColorPickerViewModel).FullName, PickedColor);if (!ret.Canceled){PickedColor = ret.Result;var toast = new Toast($"You picked a new color!({ret.Result})");toast.Show();}

当然我们也可以自定义弹出界面的位置、背景、动画及点击空白区域退出等选项。如果需要这样自定义的话,我们要用到PickerOpenOption这个类,这个类用来设置Picker弹出时的自定义配置项,例如:

        var pickerService = ServiceLocator.Current.GetInstance<ObjectPickerService>();var openOption = new PickerOpenOption{EnableTapBlackAreaExit = true,VerticalAlignment = VerticalAlignment.Stretch,HorizontalAlignment = HorizontalAlignment.Right,Background = new AcrylicBrush{TintOpacity = 0.1},Transitions = new TransitionCollection{new EdgeUIThemeTransition{Edge = EdgeTransitionLocation.Right}}};var ret = await pickerService.PickSingleObjectAsync<Color>(typeof(TestColorPickerViewModel).FullName, PickedColor, openOption);if (!ret.Canceled){PickedColor = ret.Result;var toast = new Toast($"You picked a new color!({ret.Result})");toast.Show();}

它的呈现效果是这样的:

ColorPicker

结尾

这篇博文里我给大家讲解了如何使用Picker来构建一个颜色选择器弹窗,这只是一个小例子,Picker有非常多的使用场景,例如:

  • 文本输入弹窗(注册类型为string);
  • 普通自定义Dialog界面(统一注册类型为bool即可);
  • 图片编辑弹窗(注册类型为文件或者图片);
  • ...

最后,完整项目代码链接在这里:GitHub链接点这里,欢迎大家使用,或者提出意见!

本篇博客到此结束!谢谢大家!

posted on 2018-11-15 08:29 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/9961490.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/570157.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# WebRequest.Create 锚点“#”字符问题

背景 在与后台API接口对接时&#xff0c;如将网页Url作为参数请求数据时&#xff0c;如果是锚点参数&#xff0c;则会丢失。 锚点参数 请求通过WebRequest.Create创建一个WebRequest&#xff1a; 1 var uri "https://id.test.xxx.com/api/v1/auth/sso/url?redirectUrlht…

免费的编程中文书籍索引(2018第三版)

之前我在 github 上整理了来一份&#xff1a;free-programming-books-zh_CN&#xff08;免费的计算机编程类中文书籍&#xff09;。 截至目前为止&#xff0c;已经在 GitHub 收获了 40000 多的 stars&#xff0c;有 90 多人发了 600 多个 Pull Requests 和 issues。 在收集的过…

分类与监督学习,朴素贝叶斯分类算法

1.理解分类与监督学习、聚类与无监督学习。 &#xff08;1&#xff09;简述分类与聚类的联系与区别。 分类就是按照某种标准给对象贴标签&#xff0c;再根据标签来区分归类。聚类是指事先没有“标签”而通过某种成团分析找出事物之间存在聚集性原因的过程。 区别是&#xff0c…

一张图搞定OAuth2.0

转发&#xff1a;https://www.cnblogs.com/flashsun/p/7424071.html 目录 1、引言2、OAuth2.0是什么3、OAuth2.0怎么写1、引言 本篇文章是介绍OAuth2.0中最经典最常用的一种授权模式&#xff1a;授权码模式 非常简单的一件事情&#xff0c;网上一堆神乎其神的讲解&#xff0c;让…

linux部署redis详细步骤

公司一直在使用redis集群&#xff0c;寻思着自己也部署一套练练手。 打开redis的官网下载页&#xff1a;https://redis.io/download 按照官网的步骤进行操作&#xff1a; 你会发现输入src/redis-cli命令之后&#xff0c;一直连接不上。 提示信息&#xff1a;Could not connect …

四则运算 结对项目

github 地址:https://github.com/wangshicheng0213/HomeWork02 一、基本要求 1) 实现一个带有用户界面的四则运算。 2) 生成的题目不能重复。 3) 支持负数&#xff0c;例如-1&#xff0c;-1/2&#xff0c;-3‘4/5等。 4) 题目的数量&#xff08;个人项目的要求&#xff09; 5) …

大型数据库

over&#xff08;order by salary&#xff09; 按照salary排序进行累计&#xff0c;order by是个默认的开窗函数 over&#xff08;partition by deptno&#xff09;按照部门分区 如何使用Oracle Round 函数 (四舍五入)描述 : 传回一个数值&#xff0c;该数值是按照指定的小数位…

thinkPHP 数据库操作和分页类

转载于:https://www.cnblogs.com/finddata/p/10013962.html

RHCE基础环境系统的搭建

RHCE基础环境系统的搭建 安装前提&#xff1a; 安装的时候对系统和硬件的要求&#xff1a; 红帽系统安装队系统的要求&#xff1a;Windows操作系统选择64位的内存至少6GCPU需要支持虚拟化技术在做红帽系统实验的时候&#xff0c;把360类似这样的杀毒或是管家软件退出了&#xf…

Chrome Extension Dark Theme

Chrome Extension & Dark Theme https://chrome.google.com/webstore/detail/eimadpbcbfnmbkopoojfekhnkhdbieeh https://github.com/darkreader/darkreader https://github.com/xyz-data/darkreader 转载于:https://www.cnblogs.com/xgqfrms/p/10017780.html

mybatis 控制台打印执行的SQL语句

1. Spring boot 集成 mybatis 【转载】SpringBoot中Mybatis打印sql 1.1 如果使用的是application.properties文件&#xff0c;加入如下配置&#xff1a; 1 logging.level.com.example.demo.daodebug 红色部分指的是mybatis对应的方法接口所在的包路径。 1.2 如果使用的是appli…

轻知 | 为什么全球只有13组根域名服务器?

欢迎大家前往腾讯云社区&#xff0c;获取更多腾讯海量技术实践干货哦~ 本文由9527发表 根域名服务器是域名解析系统&#xff08;DNS&#xff09;中最为顶级的域名服务器&#xff0c;它们负责管理顶级域的权威域名服务器地址。作为互联网基础设施的重要部分&#xff0c;所有域名…

check_http语法和选项

check_http H hostname (or) -I ip-address {optional options} 常用的几个例子 1. 检测http协议 $ check_http -H 192.168.1.50 HTTP OK HTTP/1.1 200 OK - 332 bytes in 0.004 seconds |time0.004144s;;;0.000000 size332B;;;0 2.检测https协议 $ check_http -H 192.168.1.50…

CentOs如何挂载硬盘

远程SSH登录上Centos服务器后&#xff0c;进行如下操作提醒&#xff1a;挂载操作会清空数据&#xff0c;请确认挂载盘无数据或者未使用第一步&#xff1a;列出所有磁盘 命令&#xff1a; ll /dev/disk/by-path 提示&#xff1a;如果无法确认数据盘设备名称&#xff0c;请使…

挂载

df -Th 查看磁盘挂载情况 ls /dev/sdx* fdisk -l 查看分区情况 fdisk /dev/sdb 分区mnpw uuid:设备的唯一号 blkidUUID"0a59654a-6f2c-4bc1-bbaf-df844e60e2e3" UUID"fe8c9dd4-571c-40a4-837a-a4ab6e4ae7e转载于:https://www.cnblogs.com/finddata/p/10041496.h…

AWS EC2实例Ubuntu系统设置root用户密码并使用root/ubuntu用户登录

参考链接&#xff1a;http://www.wangchao.info/1137.html 注意&#xff1a;链接中写的简化了&#xff0c;其中重启服务的命令似乎不太适用&#xff0c;可能是不通用&#xff0c;我下面描述的方式亲测可行&#xff0c;如有其他疑问请留言&#xff1b; https://blog.csdn.net/p…

坑题

题目描述 小姐姐想要配 n 把钥匙&#xff0c;她走过开锁铺问老板价钱&#xff0c;老板是这么说的&#xff1a; 小姐姐想知道完成配n把钥匙的任务最少需要花费多少钱 输入描述: 题目有多组测试数据。第一行输入一个整数T&#xff08;组数少于100组&#xff09;&#xff0c;表示测…

最简单的nginx教程 - 如何把一个web应用部署到nginx上

Nginx (engine x) 是一个高性能的HTTP和反向代理服务&#xff0c;也是一个IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点&#xff08;俄文&#xff1a;Рамблер&#xff09;开发的&#xff0c;第一个公开版本0.1.0发布于2004年10月4日…

Median(二分+二分)

Median http://poj.org/problem?id3579 Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 11225 Accepted: 4016Description Given N numbers, X1, X2, ... , XN, let us calculate the difference of every pair of numbers: ∣Xi - Xj∣ (1 ≤ i &#xff1c; j …

Judy alpha 第七天

SCRUM 今天 debugger 部分由 Yu Xing 继续完成断点功能&#xff0c;由 Zhiqi Lin 开始实现查看变量功能。项目整体打包测试仍有困难&#xff0c;VS Code extension 的文档质量不佳&#xff0c;大家感到难以调试。成员昨日进展今日任务Zibo Wang协助打包、追踪开发进度协助打包、…