如何禁用列表框中的选择?
如何禁用列表框中的选择?
Answers:
ItemsControl
除非需要的其他方面,否则ListBox
可以使用ItemsControl
。它将项目放置在中,ItemsPanel
并且没有选择的概念。
<ItemsControl ItemsSource="{Binding MyItems}" />
默认情况下,ItemsControl
不支持对其子元素进行虚拟化。如果您有很多东西,虚拟化可以减少内存使用并提高性能,在这种情况下,您可以使用方法2并设置样式ListBox
或向中添加虚拟化ItemsControl
。
ListBox
或者,只需设置ListBox的样式,使选择不可见。
<ListBox.Resources>
<Style TargetType="ListBoxItem">
<Style.Resources>
<!-- SelectedItem with focus -->
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}"
Color="Transparent" />
<!-- SelectedItem without focus -->
<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}"
Color="Transparent" />
<!-- SelectedItem text foreground -->
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}"
Color="Black" />
</Style.Resources>
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
</Style>
</ListBox.Resources>
ItemsControl
将完全删除任何选择概念。
我找到了一个非常简单直接的解决方案为我工作,我希望它也对您有用
<ListBox ItemsSource="{Items}">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Focusable" Value="False"/>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
Focusable = "False"
!
<Setter Property="IsHitTestVisible" Value="False" />
您可以改用ItemsControl
而不是ListBox
。An ItemsControl
没有选择的概念,因此没有必要关闭。
ItemTemplate
。
另一个值得考虑的选项是禁用ListBoxItems。可以通过设置ItemContainerStyle来完成此操作,如以下代码片段所示。
<ListBox ItemsSource="{Binding YourCollection}">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="IsEnabled" Value="False" />
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
如果您不希望文本为灰色,则可以通过使用以下键向样式的资源添加画笔来指定禁用的颜色:{x:Static SystemColors.GrayTextBrushKey}。另一种解决方案是重写ListBoxItem控件模板。
如果我需要使用列表框而不是itemscontrol,但是我只是显示不应选择的项目,这也可以使用:
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="IsHitTestVisible" Value="False" />
</Style>
</ListBox.ItemContainerStyle>
这里给出了很好的答案,但是我正在寻找稍微不同的东西:我想要选择,但只是不想显示(或以其他方式显示)。
上面的解决方案对我不起作用(完全),因此我做了其他事情:我为列表框使用了一种新样式,它完全重新定义了模板:
<Style x:Key="PlainListBoxStyle" TargetType="ListBox">
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<ContentPresenter />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBox}">
<ItemsPresenter/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
从此开始,您可以轻松地添加自己的选择突出显示,或者如果您根本不想要任何内容,则可以像这样保留它。
@Drew Noakes的答案是大多数情况下的快速解决方案,但是设置x:Static笔刷存在一些缺陷。
当按照建议设置x:Static笔刷时,列表框项目中的所有子控件都将继承此样式。
这意味着,尽管这将禁用列表框项目的突出显示,但可能会导致子控件产生不良效果。
例如,如果您的ListBoxItem中有一个ComboBox,它将使鼠标无法在ComboBox中突出显示。
相反,请考虑按照此stackoverflow线程中提到的解决方案中所述,为Selected,Unselected和MouseOver事件设置VisualStates:从ListBoxItem除去控件突出显示,而不是子控件。
-弗林尼
我提出了另一种解决方案。只需重新模板ListBoxItem
就可以了ContentPresenter
,就像这样...
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<ContentPresenter />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我采用这种方法的原因如下:
就我而言,我不想禁用用户与我的内容的交互,ListBoxItems
因此设置的解决方案IsEnabled
对我不起作用。
另一个尝试ListBoxItem
通过覆盖与颜色相关的属性来重新设置样式的解决方案仅适用于您确定模板使用这些属性的情况。默认样式很好,但是会与自定义样式一起破坏。
使用ItemsControl
中断的解决方案会破坏很多其他事情,因为其ItemsControl
外观与标准完全不同ListBox
,并且不支持虚拟化,这意味着ItemsPanel
无论如何您都必须重新模板化。
上面的内容不会更改的默认外观ListBox
,不会禁用的数据模板中的项目ListBox
,默认情况下支持虚拟化,并且可以独立于应用程序中可能使用或可能不使用的任何样式工作。这是KISS原则。
注意:此解决方案不会禁用通过键盘导航或右键单击的选择(即,箭头键后跟空格键)
先前的所有答案要么完全删除功能选择(在运行时不切换),要么仅删除视觉效果,但不删除选择。
但是,如果您希望能够通过代码而不是通过用户输入来选择和显示选择,该怎么办?可能是您想“冻结”用户的选择,同时又不禁用整个列表框?
解决方案是将整个ItemsContentTemplate包装到没有可见镶边的Button中。按钮的大小必须等于Item的大小,因此已完全覆盖。现在使用按钮的IsEnabled-Property:
启用按钮以“冻结”项目的选择状态。之所以有效,是因为已启用的按钮在所有鼠标事件冒泡到ListboxItem-Eventhandler之前就吃掉了它们。您的ItemsDataTemplate仍将接收MouseEvent,因为它是按钮内容的一部分。
禁用该按钮以启用通过单击更改选择。
<Style x:Key="LedCT" TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Button IsEnabled="{Binding IsSelectable, Converter={StaticResource BoolOppositeConverter}}" Template="{DynamicResource InvisibleButton}">
<ContentPresenter />
</Button>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<ControlTemplate x:Key="InvisibleButton" TargetType="{x:Type Button}">
<ContentPresenter/>
</ControlTemplate>
达特拉克斯
也许您只需要ItemsControl的功能?它不允许选择:
<ItemsControl ItemsSource="{Binding Prop1}" ItemTemplate="{StaticResource DataItemsTemplate}" />
我找到了一个完美的方法。
将ListBox IsHitTestVisible设置为false,以使用户无法将鼠标悬停或向下滚动或向上滚动。
捕获PreviewGotKeyboardFocus e.Handled = true,以便用户可以通过键盘Tab,向上箭头,向下箭头选择项目。
这样优势:
xmal
<ListBox Name="StudentsListBox" ItemsSource="{Binding Students}" ScrollViewer.VerticalScrollBarVisibility="Disabled" ScrollViewer.HorizontalScrollBarVisibility="Disabled" BorderThickness="0" Background="Transparent" IsHitTestVisible="False" PreviewGotKeyboardFocus="StudentsListBox_PreviewGotKeyboardFocus">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Padding" Value="0"/>
<Setter Property="Margin" Value="0"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Border x:Name="Bd">
<ContentPresenter/>
</Border>
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Selector.IsSelectionActive" Value="False" />
<Condition Property="IsSelected" Value="True" />
</MultiTrigger.Conditions>
<Setter TargetName="Bd" Property="Background" Value="Yellow" />
<Setter TargetName="Bd" Property="BorderBrush" Value="Transparent" />
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Margin="0,0,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Name="GradeBlock" Text="{Binding Grade}" FontSize="12" Margin="0,0,5,0"/>
<TextBlock Grid.Column="1" Name="NameTextBlock" Text="{Binding Name}" FontSize="12" TextWrapping="Wrap"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ListBox>
码
private void StudentsListBox_PreviewGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
e.Handled = true;
}
对我来说最好的解决方案是:
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Focusable" Value="True"/>
<Setter Property="IsHitTestVisible" Value="False" />
</Style>
</ListBox.ItemContainerStyle>
IsEnabled =假
要禁用列表框/下拉列表中的一个或多个选项,您可以添加“ disabled”属性,如下所示。这样可以防止用户选择此选项,并且它会显示为灰色。
ListItem item = new ListItem(yourvalue, yourkey);
item.Attributes.Add("disabled","disabled");
lb1.Items.Add(item);