在ListBox中没有"None"选择模式,是否有其他方法禁用列表框的选择功能?

209

如何在ListBox中禁用选择?


1
你能提供一个例子,说明在哪种情况下拥有一个无法选择的ListBox是有效的吗?因为主要行为是选择项目。我可能会选择另一种方式来显示它。(这不是我试图批评,而是对可能发生的情况感到真正的兴趣) - Marthin
3
@Martin:例如,如果你想从一个列表框项中拖动内容,那么在这种情况下,你可能不需要选择该项。此外,在拖动项时,列表框的选定项会随着你在列表框内拖动而改变-请参阅此帖子https://dev59.com/D2sz5IYBdhLWcg3w5ME0 - Danield
1
我相信Shimmy想使用ListBox的原因是,提问者有时可以使列表框可选择。这个问题对我也很有价值。比如你正在构建一款纸牌游戏。你可以从你的牌中选择一张牌,有时候你可以选择多张,而在其他时候,你不能选择任何一张。 - Gqqnbig
1
有时候你会有10张卡片,但只有其中4张是可选的。在这4张卡片中,你最多可以选择3张。 - Gqqnbig
1
@Marthin:当您在ListBox中使用GridView时,GridView标题提供了许多其他地方无法提供的功能。而且,您在网格视图单元格中有编辑控件。 - Robin Davies
17个回答

1
在 Windows Phone 上简单有效的修复方法是,在选择时将所选项设置为 null:
    <ListBox SelectionChanged="ListBox_SelectionChanged">

并且在代码后台:

    private void ListBox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
    {
        (sender as ListBox).SelectedItem = null;
    }

0

解决方案应该简单明了。

这个方案有几个优点:

  • 键盘导航也被禁用。这在IsFocusableIsHitTestVisible等情况下并非如此。
  • 没有“禁用”元素的视觉提示:只有ListBoxItem被禁用,但是TextBlock.Foreground属性设置了正确的颜色。

结果:一个项目不能通过键盘或鼠标选择,并且颜色不是“灰色”,因为我们没有禁用整个控件。

<ListBox>
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="IsEnabled" Value="False" />
        </Style>
    </ListBox.ItemContainerStyle>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding}" Foreground="Black" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

0

对我来说,最好的解决方案是:

        <ListBox.ItemContainerStyle>
            <Style TargetType="{x:Type ListBoxItem}">
                <Setter Property="Focusable" Value="True"/>
                <Setter Property="IsHitTestVisible" Value="False" />
            </Style>
        </ListBox.ItemContainerStyle>

0

注意:此解决方案不会禁用键盘导航或右键单击选择(即箭头键后跟空格键)

所有先前的答案要么完全删除选择功能(无法在运行时切换),要么仅删除视觉效果,但不删除选择。

但是,如果您想通过代码选择并显示选择,而不是通过用户输入选择呢?也许您想在不禁用整个列表框的情况下“冻结”用户的选择?

解决方案是将整个ItemsContentTemplate包装到没有视觉chrome的按钮中。按钮的大小必须等于项目的大小,因此它完全被覆盖。 现在使用按钮的IsEnabled属性:

启用按钮以“冻结”项目的选择状态。这是有效的,因为启用的按钮在鼠标事件冒泡到ListboxItem-Eventhandler之前吞噬了所有鼠标事件。您的ItemsDataTemplate仍将接收MouseEvents,因为它是按钮内容的一部分。

禁用按钮以启用通过单击更改选择。

<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


0
您可以在列表框上方放置一个文本块,这不会改变您应用程序的外观,也不允许选择任何项目。

1
你仍然需要禁用选项卡导航。 - Amanduh

-3
要在您的列表框/下拉菜单中禁用一个或多个选项,您可以像下面所示添加"disabled"属性。这将阻止用户选择该选项,并使其变为灰色覆盖。
ListItem item = new ListItem(yourvalue, yourkey);
item.Attributes.Add("disabled","disabled");
lb1.Items.Add(item);

1
那次你抽了点高,用一个ASP.NET的解决方案回答了一个WPF的问题。 - user1228

-3

IsEnabled = false


2
这使得一切都变得灰暗,这不是我要找的。 - Shimmy Weitzhandler
1
但这是一个简单问题的直接答案 :) - Viktor Jevdokimov
1
一个直截了当的回答是这个:https://dev59.com/aXM_5IYBdhLWcg3wZSI6,不过还是谢谢。 - Shimmy Weitzhandler
非常有帮助,我想要灰色和禁用! - Martin Robins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接