当前位置:   article > 正文

WPF基础五:UI④ 条目控件ComboBox

WPF基础五:UI④ 条目控件ComboBox

Object->DispatcherObject->DependencyObject->Visual->UIElement->FrameworkElement->Control->ItemsControl->Selector->ComboBox


Selector

表示允许用户从其子元素中选择项的控件。

Selector 为 ItemsControl ,这意味着它可以包含任何类型的对象的集合 (例如字符串、图像或面板) 。 有关更多信息,请参见 ItemsControl 类。

名称备注权限
IsSelectedProperty标识 IsSelected 附加属性。public static readonly
IsSelectionActiveProperty标识 IsSelectionActive 附加属性。public static readonly
IsSynchronizedWithCurrentItemProperty标识 IsSynchronizedWithCurrentItem 依赖项属性。public static readonly
SelectedEvent标识 Selected 路由事件。public static readonly
SelectedIndexProperty标识 SelectedIndex 依赖项属性。public static readonly
SelectedItemProperty标识 SelectedItem 依赖项属性。public static readonly
SelectedValuePathProperty标识 SelectedValuePath 依赖项属性。public static readonly
SelectedValueProperty标识 SelectedValue 依赖项属性。public static readonly
SelectionChangedEvent标识 SelectionChanged 路由事件。public static readonly
UnselectedEvent标识 Unselected 路由事件。public static readonly
名称备注权限
IsSynchronizedWithCurrentItem获取或设置指示 Selector 是否应当使 SelectedItem 与 Items 属性中的当前项保持同步的值。get; set;
SelectedIndex获取或设置当前选择中第一项的索引,如果选择为空,则返回负一(-1)。get; set;
SelectedItem获取或设置当前选择中的第一项,或者,如果选择为空,则返回 null。get; set;
SelectedValue获取或设置通过使用 SelectedItem 而获取的 SelectedValuePath 的值。get; set;
SelectedValuePath获取或设置用于从 SelectedValue 获取 SelectedItem 的路径。get; set;
名称备注权限
AddSelectedHandler为 Selected 附加事件添加处理程序。public
AddUnselectedHandler为 Unselected 附加事件添加处理程序。public
ClearContainerForItemOverride将项容器返回到其在 PrepareContainerForItemOverride(DependencyObject, Object) 之前所处的状态。protected
GetIsSelected获取附加属性 IsSelected 的值,该值表示是否选择了某个项。public
GetIsSelectionActive获取一个值,该值指示键盘焦点是否位于 Selector 中。public
OnInitialized引发 Initialized 事件。 每当在内部将 IsInitialized 设置为 true 时调用此方法。protected
OnIsKeyboardFocusWithinChanged当 IsKeyboardFocusWithin 属性更改时调用。protected
OnItemsChanged当 Selector 中的项更改时更新当前选择。protected
OnItemsSourceChanged当选择器中的项来源更改时调用。protected
OnSelectionChanged当选择更改时调用。protected
PrepareContainerForItemOverride准备好指定的元素以显示指定的项。protected
RemoveSelectedHandler移除 Selected 附加事件的处理程序。public
RemoveUnselectedHandler移除 Unselected 附加事件的处理程序。public
SetIsSelected设置指示是否选择 Selector 中的项的属性值。public
名称备注

SelectionChanged

当 Selector 的选择更改时发生。
名称备注对应方法

IsSelected

获取或设置一个值,该值指示是否选择了某个项。GetIsSelected,SetIsSelected

IsSelectionActive

获取一个值,该值指示键盘焦点是否处于 Selector 返回的值中。GetIsSelectionActive

 

名称备注对应事件

Selected

当选择项时发生。AddSelectedHandler,RemoveSelectedHandler

Unselected

当取消选择项时发生。AddUnselectedHandler,RemoveUnselectedHandler

 


ComboBox

表示带有下拉列表的选择控件,通过单击控件上的箭头可显示或隐藏下拉列表。

ComboBox允许用户从下拉列表中选择项,或根据需要在控件的文本框中输入新文本。 

ComboBox 是 ItemsControl ,这意味着它可以包含任何类型的对象的集合 (例如字符串、图像或面板) 。 有关更多信息,请参见 ItemsControl 类。

IsEditable和 IsReadOnly 属性指定 ComboBox 用户执行以下操作之一时的行为方式:

  • 输入一个字符串以选择中的项 ComboBox 。
  • 输入不与中的项对应的字符串 ComboBox 。
  • 选择文本框中的字符串的一部分。
  • 将值复制或粘贴到文本框中。

下表描述了用户可以和不可以执行的操作,具体取决于IsEditable 和 IsReadOnly的值 。

注解
 IsReadOnly 为 trueIsReadOnly 为 false
IsEditable 为 true-无法通过输入字符串选择中的项 ComboBox 。
-无法输入与中的项不对应的字符串 ComboBox 。
-可以在文本框中选择字符串的一部分 ComboBox 。
-可以复制文本框中的字符串 ComboBox ,但不能将字符串粘贴到文本框中 ComboBox 。
-可通过输入字符串在中选择一个项 ComboBox 。
-可以输入与中的项不对应的字符串 ComboBox 。
-可以在文本框中选择字符串的一部分 ComboBox 。
-可以复制或粘贴文本框中的字符串 ComboBox 。
IsEditable 为 false-可通过输入字符串在中选择一个项 ComboBox 。
-无法输入与中的项不对应的字符串 ComboBox 。
-无法选择中的部分字符串 ComboBox 。
-无法复制或粘贴中的字符串 ComboBox 。
-可通过输入字符串在中选择一个项 ComboBox 。
-无法输入与中的项不对应的字符串 ComboBox 。
-无法选择中的部分字符串 ComboBox 。
-无法复制或粘贴中的字符串 ComboBox 。

IsReadOnly仅当为时,IsEditable 属性才有效果 true 。

ComboBox是 ItemsControl ,因此它可以显示简单字符串以外的内容。 例如,你可以创建一个 ComboBox 包含映像列表的。 如果ComboBox 中的内容不是字符串,则在ComboBox 隐藏下拉列表时,过程字符串可能出现在中。 若要在 ComboBox 包含非字符串项时显示中的字符串,请使用 TextSearch.Text 或 TextSearch.TextPath 附加属性。


名称备注权限
IsDropDownOpenProperty标识 IsDropDownOpen 依赖项属性。public static readonly
IsEditableProperty标识 IsEditable 依赖项属性。public static readonly
IsReadOnlyProperty标识 IsReadOnly 依赖项属性。public static readonly
MaxDropDownHeightProperty标识 MaxDropDownHeight 依赖项属性。public static readonly
SelectionBoxItemProperty标识 SelectionBoxItem 依赖项属性。public static readonly
SelectionBoxItemStringFormatProperty标识 SelectionBoxItemStringFormat 依赖项属性。public static readonly
SelectionBoxItemTemplateProperty标识 SelectionBoxItemTemplate 依赖项属性。public static readonly
ShouldPreserveUserEnteredPrefixProperty标识 ShouldPreserveUserEnteredPrefix 依赖项属性。public static readonly
StaysOpenOnEditProperty标识 StaysOpenOnEdit 依赖项属性。public static readonly
TextProperty标识 Text 依赖项属性。public static readonly
名称备注权限
HandlesScrolling获取一个值,该值指示组合框是否支持滚动。get;
HasEffectiveKeyboardFocus获取一个值,该值指示 ComboBox 是否具有焦点。get;
IsDropDownOpen获取或设置一个值,该值指示组合框的下拉部分当前是否打开。get; set;
IsEditable获取或设置一个值,该值指示启用或禁用 ComboBox 的文本框中的文本编辑。get; set;
IsReadOnly获取或设置启用仅限选择模式的值,在此模式中,可选择但不可编辑组合框中的内容。get; set;
IsSelectionBoxHighlighted确定是否突出显示 SelectionBoxItemget;
MaxDropDownHeight获取或设置组合框下拉部分的最大高度。get; set;
SelectionBoxItem获取在选择框中显示的项。get;
SelectionBoxItemStringFormat获取一个撰写字符串,该字符串指定如果选择框中的选定项显示为字符串,应如何设置该选定项的格式。get;
SelectionBoxItemTemplate获取选择框内容的项模板。get;
ShouldPreserveUserEnteredPrefix获取或设置指示 ComboBox 是保留用户的输入还是将输入替换为匹配的项的值。get; set;
StaysOpenOnEdit获取或设置已打开并显示下拉控件的 ComboBox 在用户单击 TextBox 时是否将保持打开状态。get; set;
Text获取或设置当前选定项的文本。get; set;
名称备注权限
GetContainerForItemOverride创建或标识用于显示指定项的元素。protected
IsItemItsOwnContainerOverride确定指定项是否是(或者是否可以作为)自己的 ItemContainerprotected
OnApplyTemplate调用 ApplyTemplate() 时进行调用。public
OnCreateAutomationPeer提供 ComboBoxAutomationPeer 此控件的适当实现,作为 WPF 基础结构的一部分。protected
OnDropDownClosed当组合框的弹出窗口关闭时报告。protected
OnDropDownOpened当组合框的弹出窗口打开时报告。protected
OnIsKeyboardFocusWithinChanged报告 IsKeyboardFocusWithin 属性已更改。protected
OnIsMouseCapturedChanged当 IsMouseCaptured 属性更改时调用。protected
OnKeyDown在发生 KeyDown 附加路由事件时调用。protected
OnMouseLeftButtonUp调用此方法以报告已释放鼠标左键。protected
OnPreviewKeyDown在发生 PreviewKeyDown 附加路由事件时调用。protected
OnSelectionChanged通过引发 ComboBox 事件来对 SelectionChanged 选择更改进行响应。protected
PrepareContainerForItemOverride准备好指定的元素以显示指定的项。protected
名称备注

DropDownClosed

当关闭组合框的下拉列表时发生。

DropDownOpened

当打开组合框的下拉列表时发生。

ComboBoxItem

在 ComboBox 内实现可选择的项。

默认情况下,ComboBoxItem 的 HorizontalAlignment设置为 Stretch 。  StackPanel 的默认水平位置是 Center 。 如果你通过StackPanel设置ComboBoxItem的 Width 属性,则会应用StackPanel的默认值,将项目居中。

ComboBoxItem是 ContentControl ,这意味着它可以包含任何类型的单个对象 (例如字符串、图像或面板) 。 有关更多信息,请参见 ContentControl 类。

若要对多个 ComboBoxItem 控件应用相同的属性设置,请使用 Style 属性。 您可以修改 ControlTemplate 默认值,为控件指定独特的外观。 有关创建 ControlTemplate 的详细信息,请参阅 通过创建 System.windows.controls.controltemplate> 自定义现有控件的外观。 若要查看特定于 ComboBoxItem 的部分和状态,请参阅 ComboBox 样式和模板

此控件的依赖属性可能由控件的默认样式设置。 如果按默认样式设置属性,则当控件出现在应用程序中时,属性可能会更改为默认值。 默认样式取决于应用程序运行时使用的桌面主题。 有关详细信息,请参阅 默认的 WPF 主题

只有视觉对象属性已存在于控件的默认模板中并且已使用 TemplateBinding 设置时,设置该属性才有效。 在通过创建 ControlTemplate 自定义现有控件的外观一文的更改控件的视觉结构部分可以找到视觉属性列表。

https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.controls.comboboxitem?view=net-5.0

字段

名词备注权限
IsHighlightedProperty标识 IsHighlighted 依赖项属性public

属性

名词备注权限
IsHighlighted获取一个指示是否突出显示该项的值get; protected set;

方法

名词备注权限
OnContentChanged当 Content 属性更改时调用protected
OnGotKeyboardFocus宣布键盘焦点位于此元素上protected
OnMouseEnter响应 MouseEnter 事件protected
OnMouseLeftButtonDown响应 MouseLeftButtonDown 事件protected
OnMouseLeftButtonUp响应 MouseLeftButtonUp 事件protected

主要用的一些属性、事件:

  • ComboBox

IsDropDownOpen:ComboBox当前是否处于打开状态(ComboBox是展开还是收缩)。

IsEditable :ComboBox的是否可编辑(是否可以进入TextBox编辑状态,能进入编辑状态不一定可以编辑ComboBox,取决于IsReadOnly)。

IsReadOnly:该值启用仅选择模式(ComboBox只选,不可编辑模式)。

MaxDropDownHeight:ComboBox的最大高度(ComboBox展开后的最大高度,最大高度大于所需高度,显示所需高度)。

SelectionBoxItem:获取显示在ComboBox中的项目(获取选中项)。

ShouldPreserveUserEnteredPrefix:ComboBox的输入匹配功能(先开启IsEditable )。

StaysOpenOnEdit:当用户单击文本区域以开始编辑时,是否使下拉控件保持打开状态;(编辑状态,ComboBox是否保持展开状态)

Text:获取或设置当前选定项的文本。

DropDownClosed、ComboBox.DropDownOpened:打开关闭ComboBox发生的事件。

  • ComboBoxItem

IsHighlighted:获取是否突出显示该项的值。

  • Selector

IsSynchronizedWithCurrentItem:是否应当使 SelectedItem 与 Items 属性中的当前项保持同步的值。

SelectedIndex:当前索引,如果选择为空,则返回负一(-1)。选中项,ListBoxItem.IsSelected优先。

SelectedItem:当前选择中项,如果选择为空,则返回 null。

SelectedValue:通过使用 SelectedItem 而获取的 SelectedValuePath 的值。

SelectedValuePath:从 SelectedValue 获取 SelectedItem 的路径。

SelectionChanged:当 Selector 的选择更改时发生。

  • ListBoxItem

IsSelected :如果选定了项,则为 true;否则为 false。 默认值为 false


XAML范例

  1. <Window x:Class="ComboBoxDemo.MainWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6. xmlns:local="clr-namespace:ComboBoxDemo"
  7. mc:Ignorable="d"
  8. Title="MainWindow" Height="450" Width="600">
  9. <StackPanel >
  10. <TextBlock x:Name="tbk1" Height="30"/>
  11. <ComboBox x:Name="ComboBox1" Height="30" IsDropDownOpen="True" IsEditable="True" IsReadOnly="False" MaxDropDownHeight="400" ShouldPreserveUserEnteredPrefix="True" StaysOpenOnEdit="True"
  12. SelectedIndex="7"
  13. DropDownClosed="OnDropDownClosed" DropDownOpened="OnDropDownOpened" SelectionChanged="OnSelectionChanged" >
  14. <ComboBox.Resources>
  15. <Style TargetType="ComboBoxItem">
  16. <Style.Triggers>
  17. <Trigger Property="IsHighlighted" Value="True">
  18. <Setter Property="FontWeight" Value="Bold"/>
  19. <Setter Property="Foreground" Value="Red"/>
  20. </Trigger>
  21. </Style.Triggers>
  22. </Style>
  23. </ComboBox.Resources>
  24. <ComboBoxItem Content="Item 0" />
  25. <ComboBoxItem Content="Item 1"/>
  26. <ComboBoxItem Content="Item 2"/>
  27. <ComboBoxItem Content="Item 3"/>
  28. <ComboBoxItem Content="Item 4" IsSelected="True"/>
  29. <ComboBoxItem Content="Item 5"/>
  30. <ComboBoxItem Content="Item 6"/>
  31. <ComboBoxItem Content="Item 7"/>
  32. <ComboBoxItem Content="Item 8"/>
  33. <ComboBoxItem Content="Item 9"/>
  34. </ComboBox>
  35. <Label Height="30"/>
  36. </StackPanel>
  37. </Window>
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Windows;
  7. using System.Windows.Controls;
  8. using System.Windows.Data;
  9. using System.Windows.Documents;
  10. using System.Windows.Input;
  11. using System.Windows.Media;
  12. using System.Windows.Media.Imaging;
  13. using System.Windows.Navigation;
  14. using System.Windows.Shapes;
  15. namespace ComboBoxDemo
  16. {
  17. /// <summary>
  18. /// MainWindow.xaml 的交互逻辑
  19. /// </summary>
  20. public partial class MainWindow : Window
  21. {
  22. static int Count = 0;
  23. public MainWindow()
  24. {
  25. InitializeComponent();
  26. }
  27. private void OnDropDownClosed(object sender, EventArgs e)
  28. {
  29. ComboBox myitem=new ComboBox();
  30. foreach (var item1 in (this.Content as StackPanel).Children)
  31. {
  32. if (item1 is ComboBox) myitem = (item1 as ComboBox);
  33. }
  34. foreach (var item in (this.Content as StackPanel).Children)
  35. {
  36. if (item is TextBlock) (item as TextBlock).Text = "ComboBox is DropDownClosed. Selected Item is "+ myitem.Text;
  37. }
  38. }
  39. private void OnDropDownOpened(object sender, EventArgs e)
  40. {
  41. ComboBox myitem = new ComboBox();
  42. foreach (var item1 in (this.Content as StackPanel).Children)
  43. {
  44. if (item1 is ComboBox) myitem = (item1 as ComboBox);
  45. }
  46. foreach (var item in (this.Content as StackPanel).Children)
  47. {
  48. if (item is TextBlock) (item as TextBlock).Text = "ComboBox is DropDownOpened. Selected Item is " + myitem.Text;
  49. }
  50. }
  51. private void OnSelectionChanged(object sender, RoutedEventArgs e)
  52. {
  53. ComboBox myitem = new ComboBox();
  54. foreach (var item1 in (this.Content as StackPanel).Children)
  55. {
  56. if (item1 is ComboBox) myitem = (item1 as ComboBox);
  57. }
  58. this.Title = "SelectionChanged" + (++Count);
  59. foreach (var item in (this.Content as StackPanel).Children)
  60. {
  61. if (item is Label) (item as Label).Content = "SelectedIndex:" + (myitem as System.Windows.Controls.Primitives.Selector).SelectedIndex + ". SelectedValve: " + (myitem as System.Windows.Controls.Primitives.Selector).SelectedValue + ".";
  62. }
  63. }
  64. }
  65. }

C#代码

如下注意:Setters是Style,还是Trigger的属性,将影响样式。(注:以下代码和XAML代码的运行结果略有不同)

  1. myComboBoxItemStyle.Setters.Add(new Setter(ComboBoxItem.FontSizeProperty, 30.0));
  2. MyIsHighlightedtrigger.Setters.Add(new Setter(ComboBoxItem.FontWeightProperty, FontWeights.Bold));

完整代码如下(XAML默认,不添加任何代码即可):

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Windows;
  7. using System.Windows.Controls;
  8. using System.Windows.Data;
  9. using System.Windows.Documents;
  10. using System.Windows.Input;
  11. using System.Windows.Media;
  12. using System.Windows.Media.Imaging;
  13. using System.Windows.Navigation;
  14. using System.Windows.Shapes;
  15. namespace ComboBoxDemo
  16. {
  17. /// <summary>
  18. /// MainWindow.xaml 的交互逻辑
  19. /// </summary>
  20. public partial class MainWindow : Window
  21. {
  22. static int Count = 0;
  23. public MainWindow()
  24. {
  25. InitializeComponent();
  26. StackPanel mystackPanel = new StackPanel();
  27. TextBlock mytextBlock = new TextBlock();
  28. ComboBox mycomboBox = new ComboBox();
  29. Label mylabel = new Label();
  30. mytextBlock.Name = "tbk1";
  31. mytextBlock.Height = 30;
  32. mycomboBox.Name = "tbk1";
  33. mycomboBox.Height = 30;
  34. mycomboBox.IsDropDownOpen = true;
  35. mycomboBox.IsEditable = true;
  36. mycomboBox.IsReadOnly = false;
  37. mycomboBox.MaxDropDownHeight = 400;
  38. mycomboBox.ShouldPreserveUserEnteredPrefix = true;
  39. mycomboBox.StaysOpenOnEdit = true;
  40. mycomboBox.SelectedIndex = 7;
  41. mycomboBox.DropDownClosed += OnDropDownClosed;
  42. mycomboBox.DropDownOpened += OnDropDownOpened;
  43. mycomboBox.SelectionChanged += OnSelectionChanged;
  44. Style myComboBoxItemStyle = new Style(typeof(ComboBoxItem));
  45. Trigger MyIsHighlightedtrigger = new Trigger { Property = ComboBoxItem.IsHighlightedProperty, Value = true };
  46. myComboBoxItemStyle.Setters.Add(new Setter(ComboBoxItem.FontSizeProperty, 30.0));
  47. MyIsHighlightedtrigger.Setters.Add(new Setter(ComboBoxItem.FontWeightProperty, FontWeights.Bold));
  48. MyIsHighlightedtrigger.Setters.Add(new Setter(ComboBoxItem.ForegroundProperty, Brushes.Red));
  49. myComboBoxItemStyle.Triggers.Add(MyIsHighlightedtrigger);
  50. mycomboBox.ItemContainerStyle = myComboBoxItemStyle;
  51. List<ComboBoxItem> list = new List<ComboBoxItem>();
  52. for (int i = 0; i < 10; i++)
  53. {
  54. list.Add(new ComboBoxItem());
  55. list[i].Content = "Item " + i;
  56. }
  57. list[4].IsSelected = true;
  58. mycomboBox.ItemsSource = list;
  59. mylabel.Height = 30;
  60. mystackPanel.Children.Add(mytextBlock);
  61. mystackPanel.Children.Add(mycomboBox);
  62. mystackPanel.Children.Add(mylabel);
  63. this.Content = mystackPanel;
  64. }
  65. private void OnDropDownClosed(object sender, EventArgs e)
  66. {
  67. ComboBox myitem=new ComboBox();
  68. foreach (var item1 in (this.Content as StackPanel).Children)
  69. {
  70. if (item1 is ComboBox) myitem = (item1 as ComboBox);
  71. }
  72. foreach (var item in (this.Content as StackPanel).Children)
  73. {
  74. if (item is TextBlock) (item as TextBlock).Text = "ComboBox is DropDownClosed. Selected Item is "+ myitem.Text;
  75. }
  76. }
  77. private void OnDropDownOpened(object sender, EventArgs e)
  78. {
  79. ComboBox myitem = new ComboBox();
  80. foreach (var item1 in (this.Content as StackPanel).Children)
  81. {
  82. if (item1 is ComboBox) myitem = (item1 as ComboBox);
  83. }
  84. foreach (var item in (this.Content as StackPanel).Children)
  85. {
  86. if (item is TextBlock) (item as TextBlock).Text = "ComboBox is DropDownOpened. Selected Item is " + myitem.Text;
  87. }
  88. }
  89. private void OnSelectionChanged(object sender, RoutedEventArgs e)
  90. {
  91. ComboBox myitem = new ComboBox();
  92. if(this.Content!=null)
  93. {
  94. foreach (var item1 in (this.Content as StackPanel).Children)
  95. {
  96. if (item1 is ComboBox) myitem = (item1 as ComboBox);
  97. }
  98. this.Title = "SelectionChanged" + (++Count);
  99. foreach (var item in (this.Content as StackPanel).Children)
  100. {
  101. if (item is Label) (item as Label).Content = "SelectedIndex:" + (myitem as System.Windows.Controls.Primitives.Selector).SelectedIndex + ". SelectedValve: " + (myitem as System.Windows.Controls.Primitives.Selector).SelectedValue + ".";
  102. }
  103. }
  104. }
  105. }
  106. }

 

 

 

 

 

 

 


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/493465
推荐阅读
相关标签
  

闽ICP备14008679号