本篇想介绍相对小众但颇具使用价值的控件SplitButton,提到SplitButton难免会拿来与ComboBox进行比较,同时在WinUI 3的控件库中,还有一个默默无闻的DropDownButton。更加让人傻傻分不清楚,今天我们就来进行简单的区别和讨论。
首先我们看最为常见的ComboBox,核心的用途在于两点。一是节约屏幕空间,二是选中下拉列表的一项内容,其值供后续操作使用。另外ComboBox还可以设置为文本框可编辑,通过TextSubmitted事件获取输入值。

<ComboBox SelectionChanged="ColorComboBox_SelectionChanged" Header="Colors" PlaceholderText="Pick a color" Width="200">
<x:String>Blue</x:String>
<x:String>Green</x:String>
<x:String>Red</x:String>
<x:String>Yellow</x:String>
</ComboBox>

ComboBox除了以字符串形式显示Item,同样也能够编辑ItemTemplate来显示负责的列表内容。它与SplitButton在显示上有一点核心区别,下拉列表被选中Item的样式,会在ComboBox收起下拉框后,原样显示在下拉箭头的左边。而SplitButton,下拉显示的内容,和箭头左边的显示内容并无直接联系。
DropDownButton是个奇葩控件,我个人觉得它存在的意义完全是为了兼容性。该控件从Button继承,但这货被点击时一定会显示它所包含的Flyout,导致Button最核心的Click事件和Command对该控件来说,并没有什么意义。

<DropDownButton Content="Email">
<DropDownButton.Flyout>
<MenuFlyout Placement="Bottom">
<MenuFlyoutItem Text="Send"/>
<MenuFlyoutItem Text="Reply"/>
<MenuFlyoutItem Text="Reply All"/>
</MenuFlyout>
</DropDownButton.Flyout>
</DropDownButton>

做了长长的铺垫以后,终于来到了SplitButton本身。该控件区别与ComboBox主要有两点,一是上文提到的,下拉显示样式,和收起后的显示样式可以不相关。二是SplitButton下拉选中后的值,可以作为Click和Command的参数使用。ComboBox则不存在Click和Command,在被点击时,仅会展开下拉框供再次选择。
SplitButton的使用较为简单,只需定义Content作为选中状态的样式,以及通过Flyout提供下拉状态样式即可。在下面的XAML中,选中时SplitButton将显示为Width=100,Height=32的Rectangle,并填充颜色。而在点击箭头显示的下拉框中,会显示ColorPicker控件。

        <SplitButton>
<Rectangle Width="100" Height="32">
<Rectangle.Fill>
<SolidColorBrush Color="{x:Bind colorPicker.Color,Mode=OneWay}"></SolidColorBrush>
</Rectangle.Fill>
</Rectangle>
<SplitButton.Flyout>
<Flyout>
<ColorPicker x:Name="colorPicker" ></ColorPicker>
</Flyout>
</SplitButton.Flyout>
</SplitButton>

第二个例子参考了《WinUI 3学习笔记(2)—— 用ListView来展示集合》,将在SplitButton中显示分组列表。在ComboBox中自定义ItemTemplate是常见操作,但是相对下拉内容做分组操作就力不从心了。而在SplitButton中,却因Content和Flyout并无直接联系而变的易于实现。我们通过CollectionViewSource对象来定义供XAML使用的分组视图,放置在<SplitButton.Resources>节点中。然后在Flyout中对ListView绑定该视图,并定义HeaderTemplate。

        <SplitButton Grid.Column="1">
<SplitButton.Resources>
<CollectionViewSource x:Name="personListCVS" IsSourceGrouped="True" Source="{x:Bind PersonGroup}"/>
</SplitButton.Resources>
<TextBlock Width="100" Text="{Binding SelectedItem.Name,ElementName=listViewPersons}"></TextBlock>
<SplitButton.Flyout>
<Flyout>
<ListView x:Name="listViewPersons" ItemsSource="{x:Bind personListCVS.View}" Width="120">
<ListView.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding Key}"/>
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ListView.GroupStyle>
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"></TextBlock>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Flyout>
</SplitButton.Flyout>
</SplitButton>

本篇我们简单比较了ComboBox,DropDownButton和SplitButton在Windows Desktop App中的应用。个人认为WinUI 3是某软的一次反思和妥协。向非UWP的Desktop技术,如WPF和WinForms开放了最新的UI库和API支持(当然我劝你不要碰WinForms,过于久远且于使用XAML的WPF和UWP不是一个思路)。如果明年的WinUI 3的UnPackage App又回到了exe那种运行模式。那这些年的UWP真的搞了个寂寞。唯一的用途就是在XBOX上用爱奇艺放动画片给小朋友看?

Sample Code:
WinUI3Samples/WinUI3Samples/SplitButtonSample at main · manupstairs/WinUI3Samples (github.com)

话说现在做Windows Desktop App 开发的年轻人真的越来越少了,根本招不到人啊。岗位还是有的,竞争也不激烈。未来.NET 6的MAUI也值得期待一下,还不快来入坑?

以下链接,是MS Learn上Windows开发的入门课程,单个课程三十分钟到60分钟不等,想要补充基础知识的同学点这里:

开始使用 Visual Studio 开发 Windows 10 应用

开发 Windows 10 应用程序

编写首个 Windows 10 应用

创建 Windows 10 应用的用户界面 (UI)

增强 Windows 10 应用的用户界面

在 Windows 10 应用中实现数据绑定

WinUI 3学习笔记(3)—— ComboBox & DropDownButton & SplitButton的更多相关文章

  1. WinUI 3学习笔记(2)—— 用ListView来展示集合

    在WPF的时代,我们多是使用ListBox和ListView来展示,纵向滚动条显示的集合数据.这两个控件的默认样式,以及对触控的支持,已完全落后于时代.他们两个分别长这样,和Win10及Win11的风 ...

  2. ExtJs学习笔记之ComboBox组件

    ComboBox组件 (1)ComboBox控件支持自动完成.远程加载.和许多其他特性. (2)ComboBox就像是传统的HTML文本 <input> 域和 <select> ...

  3. WPF学习笔记:ComboBox的数据绑定

    UI <UserControl x:Class="UnitViews.UserMeUV" xmlns="http://schemas.microsoft.com/w ...

  4. 【Ext.Net学习笔记】04:Ext.Net中使用数据、Ext.Net Store的用法、Ext.Net ComboBox用法

    之前的几篇文章都是介绍Ext.Net较为基础的东西,今天的这一篇将介绍数据的一些用法,包括XTemplate绑定数据.Store(Modal.Proxy).ComboBox的用法等. XTemplat ...

  5. Ext.Net学习笔记10:Ext.Net ComboBox用法

    ComboBox是最常用的控件之一,它与HTML中的Select控件很像,但可以进行多选.自定义显示格式.分页等. ComboBox用法 <ext:ComboBox runat="se ...

  6. MVVM学习笔记

    MVVM学习笔记 1.MVVM的简介 MVVM模式是Model-View-ViewModel模式的简称,也就是由模型(Model).视图(View).视图模型(ViewModel),其目的是为了实现将 ...

  7. AU3学习笔记

    目录 1. AU3是什么?能做什么? 2. 乱学AU3中的命令(语言相关)? 3. 通过简单示例学习AU3? 4. 正则表达式的学习(对大小写敏感) 5.对于GUI的相关学习 1.        AU ...

  8. VSTO 学习笔记(六)在 Excel 2010中使用RDLC报表

    原文:VSTO 学习笔记(六)在 Excel 2010中使用RDLC报表 Excel具有强大的图表显示.分析功能,这点毋庸置疑,但是如果将常规MIS系统中的数据以报表的形式在Excel中显示,却并不那 ...

  9. 【Windows Universal Platform】只是学习笔记 - 开始

    我是初学,之前没有windows/windows phone的应用开发经验:开博的目的只是记录和督促自己学习. 心血来潮也好,或是个人喜好的原因,想学着自己开发APP了(PS:以前做过web 开发) ...

随机推荐

  1. 洛谷P2210题解

    题面 模拟退火练手好题. 对于这个题,一般有两种解法: 每次随机两个数交换. 每次直接打乱数组. 两个方法都可以过,我写了第一种,因为不想用stl. 代码

  2. 深度学习算子优化-FFT

    作者:严健文 | 旷视 MegEngine 架构师 背景 在数字信号和数字图像领域, 对频域的研究是一个重要分支. 我们日常"加工"的图像都是像素级,被称为是图像的空域数据.空域数 ...

  3. Android程序员如何通过跳槽薪资翻倍?

    马爸爸总结了一句话:跳槽,要么是钱不到位,要么是受了委屈. 我给自己这次的跳槽经历做了一个分析,希望能对那些想换工作的朋友有所帮助. 许多朋友想换工作,但是对"换工作"的理解可能仅 ...

  4. noip模拟35[第一次4题·裂了]

    noip模拟35 solutions 这是我第一次这么正式的考四个题,因为这四个题都出自同一个出题人,并不是拼盘拼出来的. 但是考得非常的不好,因为题非常难而且一直想睡觉.. 有好多我根本就不会的算法 ...

  5. 算法竞赛中的常用JAVA API :大数类(转载)

    5.算法竞赛中的常用JAVA API :大数类 摘要 java中的基础数据类型能存储的最大的二进制数是 2 ^ 63 - 1 对应的十进制数是9223372036854775807(long类型的最大 ...

  6. 面向对象第一单元总结:Java实现表达式求导

    面向对象第一单元总结:Java实现表达式求导 题目要求 输入一个表达式:包含x,x**2,sin(),cos(),等形式,对x求导并输出结果 例:\(x+x**2+-2*x**2*(sin(x**2+ ...

  7. idea自定义 tags 删除

    idea custom tags 添加后 如何去除 如何去除 custom tags 随便@一些字符串,这时候alt+enter弹出 Add xxx to custom tags, 这时候按有方向键进 ...

  8. NOIP 模拟 $25\; \rm random$

    题解 \(by\;zj\varphi\) 期望好题. 通过推规律可以发现每个逆序对的贡献都是 \(1\),那么在所有排列中有多少逆序对,贡献就是多少. \[\rm num_i=(i-1)!\sum_{ ...

  9. 第11篇-认识Stub与StubQueue

    在 第10篇-初始化模板表 我们介绍过TemplateInterpreter::initialize()函数,在这个函数中会调用TemplateTable::initialize()函数初始化模板表, ...

  10. docker 安装部署 mysql(配置文件启动)

    获取 mysql 镜像 docker pull mysql:5.6 docker images 创建容器 创建宿主机 redis 容器的数据和配置文件目录 # 创建宿主机 redis 容器的数据和配置 ...