首页 > 代码库 > 控件(选择类): Selector, ComboBox

控件(选择类): Selector, ComboBox

1、Selector(基类) 的示例
Controls/SelectionControl/SelectorDemo.xaml

<Page    x:Class="Windows10.Controls.SelectionControl.SelectorDemo"    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    xmlns:local="using:Windows10.Controls.SelectionControl"    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"    mc:Ignorable="d"        xmlns:common="using:Windows10.Common">    <Grid Background="Transparent">        <StackPanel Margin="10 0 10 10">            <TextBlock Name="textBlock" Margin="5" />            <!--                ComboBox - 下拉框控件,继承自 Selector,下面介绍 Selector 的相关知识点            -->            <ComboBox Name="comboBox1" Margin="5 20 5 5" ItemsSource="{x:Bind Employees}" Width="200" HorizontalAlignment="Left">                <ComboBox.ItemTemplate>                    <DataTemplate x:DataType="common:Employee">                        <StackPanel Orientation="Horizontal">                            <TextBlock Text="{x:Bind Name}" />                            <TextBlock Text="{x:Bind Age}" Margin="5 0 0 0" />                        </StackPanel>                    </DataTemplate>                </ComboBox.ItemTemplate>            </ComboBox>            <TextBlock Name="lblMsg1" Margin="5" />            <ComboBox Name="comboBox2" Margin="5 20 5 5" ItemsSource="{x:Bind Employees}" Width="200" HorizontalAlignment="Left">                <ComboBox.ItemTemplate>                    <DataTemplate x:DataType="common:Employee">                        <StackPanel Orientation="Horizontal">                            <TextBlock Text="{x:Bind Name}" />                            <TextBlock Text="{x:Bind Age}" Margin="5 0 0 0" />                        </StackPanel>                    </DataTemplate>                </ComboBox.ItemTemplate>            </ComboBox>            <TextBlock Name="lblMsg2" Margin="5" />            <!--                ComboBoxItem - 下拉框控件的 item,继承自 SelectorItem,下面介绍 SelectorItem 的相关知识点                    IsSelected - 是否被选中            -->            <ComboBox x:Name="comboBox3" Margin="5 20 5 5" Width="200" HorizontalAlignment="Left">                <ComboBoxItem Content="ComboBoxItem1" IsSelected="True" />                <ComboBoxItem Content="ComboBoxItem2" />                <ComboBoxItem Content="ComboBoxItem3" />            </ComboBox>        </StackPanel>    </Grid></Page>

Controls/SelectionControl/SelectorDemo.xaml.cs

/* * Selector(基类) - 选择器控件基类(继承自 ItemsControl, 请参见 /Controls/CollectionControl/ItemsControlDemo/) *     SelectedIndex - 选中项的索引 *     SelectedItem - 选中项的数据对象 *     SelectedValuePath - 选中项的值的字段路径,默认值为空字符串(此时 SelectedValue 的结果与 SelectedItem 相同) *     SelectedValue - 选中项的值(字段路径通过 SelectedValuePath 设置) *     bool GetIsSelectionActive(DependencyObject element) - 用于获取指定的 Selector 控件是否是焦点状态 *         如果是焦点状态,则按下键盘 enter 键会弹出此 Selector 控件的选项列表,按下 esc 键会隐藏此 Selector 控件的选项列表 *     IsSynchronizedWithCurrentItem - 暂时认为没用吧,因为设置为 true 后,在 runtime 会抛出 Windows.UI.Xaml.Markup.XamlParseException 异常 *     SelectionChanged - 选中项发生变化时触发的事件 *      *      * SelectorItem(基类) - Selector 的 Item(继承自 ContentControl, 请参见 /Controls/BaseControl/ContentControlDemo/) *     IsSelected - 是否被选中 */using System;using System.Collections.ObjectModel;using Windows.UI.Xaml;using Windows.UI.Xaml.Controls;using Windows10.Common;namespace Windows10.Controls.SelectionControl{    public sealed partial class SelectorDemo : Page    {        public ObservableCollection<Employee> Employees { get; set; } = TestData.GetEmployees(30);        public SelectorDemo()        {            this.InitializeComponent();            this.Loaded += SelectorDemo_Loaded;            // 不设置 SelectedValuePath,则 SelectedValue 的结果与 SelectedItem 相同            comboBox1.SelectedValuePath = "";            comboBox1.SelectionChanged += ComboBox1_SelectionChanged;            // 指定 SelectedValue 的字段路径            comboBox2.SelectedValuePath = "Name";            comboBox2.SelectionChanged += ComboBox2_SelectionChanged;        }        private void SelectorDemo_Loaded(object sender, RoutedEventArgs e)        {            DispatcherTimer dTimer = new DispatcherTimer();            dTimer.Interval = TimeSpan.Zero;            dTimer.Tick += DTimer_Tick;            dTimer.Start();        }        private void DTimer_Tick(object sender, object e)        {            textBlock.Text = $"comboBox1 focus:{ComboBox.GetIsSelectionActive(comboBox1)}, comboBox2 focus:{ComboBox.GetIsSelectionActive(comboBox2)}";        }        private void ComboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)        {            // e.RemovedItems - 本次事件中,被取消选中的项            // e.AddedItems - 本次事件中,新被选中的项            int selectedIndex = comboBox1.SelectedIndex;            // SelectedItem 是选中的 Employee 对象            // SelectedValue 是选中的 Employee 对象            lblMsg1.Text = $"comboBox1 SelectedItem:{comboBox1.SelectedItem}, SelectedValue:{comboBox1.SelectedValue}";        }        private void ComboBox2_SelectionChanged(object sender, SelectionChangedEventArgs e)        {            int selectedIndex = comboBox2.SelectedIndex;            // SelectedItem 是选中的 Employee 对象            // SelectedValue 是选中的 Employee 对象的 Name 属性的值            lblMsg2.Text = $"comboBox2 SelectedItem:{comboBox2.SelectedItem}, SelectedValue:{comboBox2.SelectedValue}";        }    }}


2、ComboBox 的示例
Controls/SelectionControl/ComboBoxDemo.xaml

<Page    x:Class="Windows10.Controls.SelectionControl.ComboBoxDemo"    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    xmlns:local="using:Windows10.Controls.SelectionControl"    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"    mc:Ignorable="d"        xmlns:common="using:Windows10.Common">    <Grid Background="Transparent">        <StackPanel Margin="10 0 10 10">            <!--                ComboBox - 下拉框控件                    Header - 可以设置一个纯文本,不能命中测试,空 Header 的话不会占用任何空间                    HeaderTemplate - 可以将 Header 设置为任何 xaml,且支持命中测试                    PlaceholderText - 占位符水印            -->            <!--通过 xaml 方式为 ComboBox 添加数据-->            <ComboBox x:Name="comboBox1" Margin="5" Width="200" HorizontalAlignment="Left"                       Header="comboBox1" PlaceholderText="PlaceholderText">                <ComboBoxItem Content="ComboBoxItem1" />                <ComboBoxItem Content="ComboBoxItem2" />                <ComboBoxItem Content="ComboBoxItem3" />            </ComboBox>            <TextBlock Name="lblMsg1" Margin="5" />            <!--为 ComboBox 绑定数据-->            <ComboBox x:Name="comboBox2" ItemsSource="{x:Bind Employees}" Margin="5 20 5 5" Width="200" HorizontalAlignment="Left">                <ComboBox.HeaderTemplate>                    <DataTemplate>                        <TextBlock Text="comboBox2" Foreground="Red" />                    </DataTemplate>                </ComboBox.HeaderTemplate>                <ComboBox.ItemTemplate>                    <DataTemplate x:DataType="common:Employee">                        <StackPanel Orientation="Horizontal">                            <TextBlock Text="{x:Bind Name}" />                            <TextBlock Text="{x:Bind Age}" Margin="5 0 0 0" />                        </StackPanel>                    </DataTemplate>                </ComboBox.ItemTemplate>            </ComboBox>            <!--通过 xaml 方式为 ComboBox 添加数据(直接用字符串的方式),在 code-behind 中可以通过 SelectedValue 直接获取选中的字符串-->            <ComboBox Name="comboBox3" SelectedIndex="0" Width="200" HorizontalAlignment="Left" Margin="5 60 5 5">                <x:String>Red</x:String>                <x:String>Green</x:String>                <x:String>Blue</x:String>            </ComboBox>                    </StackPanel>    </Grid></Page>

Controls/SelectionControl/ComboBoxDemo.xaml.cs

/* * ComboBox - 下拉框控件(继承自 Selector, 请参见 /Controls/SelectionControl/SelectorDemo.xaml) *     DropDownOpened - 下拉框打开(弹出选项列表)时触发的事件 *     DropDownClosed - 下拉框关闭(隐藏选项列表)时触发的事件 *     IsDropDownOpen - 下拉框是否处于打开状态 *     MaxDropDownHeight - 下拉框打开后,其选项列表的最大高度 *     SelectionBoxItem - 下拉框关闭后显示的数据对象(即下拉框的选项列表隐藏后,在下拉框中显示的数据对象 *      *      * ComboBoxItem - 下拉框控件的 item(继承自 SelectorItem, 请参见 /Controls/SelectionControl/SelectorDemo.xaml) */using System.Collections.ObjectModel;using Windows.UI.Xaml.Controls;using Windows10.Common;namespace Windows10.Controls.SelectionControl{    public sealed partial class ComboBoxDemo : Page    {        public ObservableCollection<Employee> Employees { get; set; } = TestData.GetEmployees(30);        public ComboBoxDemo()        {            this.InitializeComponent();            comboBox1.DropDownOpened += ComboBox1_DropDownOpened;            comboBox1.DropDownClosed += ComboBox1_DropDownClosed;            comboBox2.MaxDropDownHeight = 40;            comboBox2.Loaded += (x, y) =>             {                // 注:如果要设置 IsDropDownOpen 属性的话,需要等到 ComboBox 加载后在设置                comboBox2.IsDropDownOpen = true;            };        }                private void ComboBox1_DropDownOpened(object sender, object e)        {            lblMsg1.Text = "comboBox1 DropDownOpened";        }        private void ComboBox1_DropDownClosed(object sender, object e)        {            // 通过 SelectionBoxItem 可获取 ComboBox 的选项列表隐藏后,在 ComboBox 中显示的数据对象            lblMsg1.Text = $"comboBox1 DropDownClosed, SelectionBoxItem:{comboBox1.SelectionBoxItem}";        }    }}

控件(选择类): Selector, ComboBox