【问题标题】:WPF ListBox.UnselectAll() doesn't clear visual stateWPF ListBox.UnselectAll() 不清除视觉状态
【发布时间】:2016-10-14 17:24:39
【问题描述】:

我正在尝试构建一个允许用户取消选择项目的 ListBox。

这是我的 XAML 代码:

<ListBox Name="MyListBox"
                ItemsSource="{Binding MoeglicheHauptspeisen}"
                SelectionMode="Single">
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal" />
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Width="200"
                                Height="200"
                                Background="{StaticResource Braun}"
                                MouseDown="Speise_Gedrueckt">
                        <TextBlock Margin="0 50 0 0"
                                   HorizontalAlignment="Center"
                                   Text="{Binding SpeiseTyp}" />
                        <TextBlock HorizontalAlignment="Center" Text="{Binding Beschreibung}" />
                        <TextBlock HorizontalAlignment="Center" Text="{Binding Preis, StringFormat={}{0:C}}" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

还有我的代码隐藏:

private void Speise_Gedrueckt(object sender, MouseButtonEventArgs e)
    {
       MyListBox.UnselectAll();
    }

我可以通过再次单击它来取消选择该项目,它确实将 SelectedIndex 设置为 -1 等,但它不会清除所选项目在 ListBox 本身中的边框。

我用谷歌搜索了很多,但没有发现任何东西改变了这一事实。我尝试设置通过 style.setter 选择的项目的边框/背景,但它也没有帮助。

【问题讨论】:

    标签: c# wpf xaml listbox


    【解决方案1】:

    请注意,Listbox 项有 3 种视觉状态 - 已选择、未选择和已聚焦。即使您通过代码隐藏取消选择列表框项目,键盘焦点仍然存在(假设您通过单击它选择了它)。这就是为什么会显示某种视觉指示器的原因。

    【讨论】:

    • 是的,这就是焦点视觉。您可以将焦点设置到其他一些 UI 元素,并且焦点视觉效果消失了。
    【解决方案2】:

    不确定何时要清除所选项目,所以我添加了一个带有 EventHandler 的按钮:

       <Button Width="100" Height="40" Click="Speise_Gedrueckt"></Button>
    

    现在在单击按钮时将 SelectedItem 设置为 null:

     private void Speise_Gedrueckt(object sender, RoutedEventArgs routedEventArgs)
     {
            MyListBox.SelectedItem = null;
     }
    

    【讨论】:

    • 感谢您的回答。 “Speise_Gedrueckt”处理程序是每个 ListBox 项的单击处理程序。处理程序所做的是检查 ListBox 的 SelectedItem 是否是处理程序正在处理的项。如果是这样,则取消全选。这应该带来能够“取消选择”选定项目的行为。它确实设置了正确的值,但不会清除视觉状态,这意味着前一个选定项周围仍有边框
    • 我现在尝试使用 Button 而不是直接 StackPanel 作为 ListBox 项的 ItemTemplate 并且它有效。为什么它不清除 StackPanel 的边界?它比选定的问题更受关注吗?
    猜你喜欢
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多