没有ListBox.SelectionMode =“None”,有没有另一种方法来禁用select列表框?
如何禁用ListBox中的select?
方法1 – ItemsControl
除非你需要ListBox
其他方面,否则你可以使用ItemsControl
。 它将项目放置在ItemsPanel
,并没有select的概念。
<ItemsControl ItemsSource="{Binding MyItems}" />
默认情况下, ItemsControl
不支持其子元素的虚拟化。 如果您有很多项目,虚拟化可以减less内存使用并提高性能,在这种情况下,您可以使用方法2并设置ListBox
样式,或将虚拟化添加到ItemsControl
。
方法2 – 造型ListBox
或者,只是样式的列表框,使select不可见。
<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>
我发现了一个非常简单直接的解决scheme,我希望它也能为你做
<ListBox ItemsSource="{Items}"> <ListBox.ItemContainerStyle> <Style TargetType="{x:Type ListBoxItem}"> <Setter Property="Focusable" Value="False"/> </Style> </ListBox.ItemContainerStyle> </ListBox>
您可以切换到使用ItemsControl
而不是ListBox
。 一个ItemsControl
没有select的概念,所以没有什么可closures的。
另一个值得考虑的选项是禁用ListBoxItems。 这可以通过设置ItemContainerStyle来完成,如下面的代码片段所示。
<ListBox ItemsSource="{Binding YourCollection}"> <ListBox.ItemContainerStyle> <Style TargetType="ListBoxItem"> <Setter Property="IsEnabled" Value="False" /> </Style> </ListBox.ItemContainerStyle> </ListBox>
如果您不希望文本是灰色的,则可以通过使用以下注册键将样式的资源添加到样式资源来指定禁用的颜色:{x:Static SystemColors.GrayTextBrushKey}。 另一种解决scheme是重写ListBoxItem控件模板。
这也将工作,如果我有需要使用listbox而不是itemscontrol,但只是显示不应select的项目,我使用:
<ListBox.ItemContainerStyle> <Style TargetType="ListBoxItem"> <Setter Property="IsHitTestVisible" Value="False" /> </Style> </ListBox.ItemContainerStyle>
虽然@Drew Noakes的答案是大多数情况下的一个快速解决scheme,但是设置x:静态画笔还是有一点缺陷的。
当您按照build议设置x:静态画笔时,列表框项目内的所有子控件都将inheritance此样式。
这意味着,虽然这将禁用突出显示列表框项目,但可能会导致对子控件产生不良影响。
例如,如果您在ListBoxItem中有一个ComboBox,它将禁用鼠标而不是突出显示在ComboBox中。
相反,考虑设置VisualStates为选中,未选中,和MouseOver事件覆盖在此stackoverflow线程中提到的解决scheme: 删除控件突出显示从ListBoxItem而不是子控件 。
-Frinny
也许你需要ItemsControl的onllyfunction? 它不允许select:
<ItemsControl ItemsSource="{Binding Prop1}" ItemTemplate="{StaticResource DataItemsTemplate}" />
这里有相当好的答案,但是我正在寻找一些稍微不同的东西:我想要select,但是不想让它显示出来(或者用不同的方式显示)。
上面的解决scheme并不适用于我(完全),所以我做了其他的事情:我为我的列表框使用了一种新的样式,它完全重新定义了模板:
<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>
从这个开始,你可以很容易地添加你自己的select突出显示,或者如果你不想要的话就这样保留。
注意:此解决scheme不会禁用通过键盘导航或右击的select (即箭头键后跟空格键)
所有以前的答案要么删除能力select完全(在运行时没有切换)或只是删除视觉效果,但不是select。
但是,如果你想能够select和显示select的代码,而不是由用户input? 可能是你想“冻结”用户的select,而不禁用整个列表框?
解决scheme是将整个ItemsContentTemplate包装成一个没有可视化界面的button。 该button的大小必须等于该项目的大小,所以它被完全覆盖。 现在使用button的IsEnabled属性:
启用该button以“冻结”该项目的select状态。 这是有效的,因为启用的button会在所有鼠标事件冒泡到ListboxItem-Eventhandler之前吃掉所有的鼠标事件。 您的ItemsDataTemplate仍然会收到MouseEvents,因为它是button内容的一部分。
禁用button以启用通过单击更改select。
<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>
dartrax
您可以将一个文本块放在您的列表框上方,它不会改变您的应用程序的外观,也不会允许select任何项目。
在Windows Phone上运行的一个简单的修复程序就是将所选项目select为null:
<ListBox SelectionChanged="ListBox_SelectionChanged">
在后面的代码中:
private void ListBox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) { (sender as ListBox).SelectedItem = null; }
IsEnabled = false
Hallgeir Engen的回答是一个很好的解决scheme,但是问题是在回发之后,所有的项目都会变成可选项,所以需要你在Page_Load中添加每个ListItem的disabled属性。
但是还有更简单的解决scheme。
而不是禁用所有ListItems,您可以只禁用ListBox本身,并且他的所有列表项也被禁用。 将Enabled设置为false, 根本不会禁用ListBox,但在Page_Load中添加以下行:
this.listbox.Attributes.Add("disabled", "disabled");
发回后,项目不会变成可选的,所以你可以把这个代码行放在:
if (!this.IsPostBack) { }
但是所有项目仍然是灰色叠加,所以如果你想为所有项目着色,然后使css类:
.ListItemColor option { color: Black; /*(default color for list item, if it is not disabled)*/ }
然后将ListBox的CssClass设置为上面的这个css类。 如果你想为一些列表项目(但不是全部)着色,那么你将不得不风格一些项目,并通过源(标记)或代码(JavaScript,C#或Visual Basic)给每个人的颜色。
要禁用列表框/下拉菜单中的一个或多个选项,可以添加“disabled”属性,如下所示。 这阻止了用户select这个选项,并且得到一个灰色的覆盖。
ListItem item = new ListItem(yourvalue, yourkey); item.Attributes.Add("disabled","disabled"); lb1.Items.Add(item);