【问题标题】:How to Synchronize ListBox SelectedItem and the focused item in WPF?如何在 WPF 中同步 ListBox SelectedItem 和焦点项目?
【发布时间】:2014-10-04 00:41:02
【问题描述】:

我将按钮创建为 ListBox 项。使用键盘快捷键,所选项目/按钮将更改为第一个字符与按下的键相同的按钮。问题是焦点项目(虚线矩形)不会与选定项目同步。如果我们使用键盘箭头,则不存在此问题。短代码为:

        <ListBox x:Name="ListBoxRef" 
             ScrollViewer.HorizontalScrollBarVisibility="Disabled"
             DataContext="{Binding Path=ListViewSource}" IsSynchronizedWithCurrentItem="True"
             ItemsSource="{Binding}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Button Tag="{Binding}" IsTabStop="False"
                        Command="{Binding ElementName=UserControlTypeSelectionView, Path=DataContext.SelectCommand}"
                        CommandParameter="{Binding RelativeSource={RelativeSource Self}}">
                    <Button.Template>
                        <ControlTemplate>
                            <TextBlock Text="{Binding Path=Name}" />
                        </ControlTemplate>
                    </Button.Template>
                </Button>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ListBox>

How do you programmatically set focus to the SelectedItem in a WPF ListBox that already has focus? 中,解决方案是使用Focus 方法并在C# 端。

是否可以在 MVVM 中仅使用 XAML?

【问题讨论】:

  • 您也许可以使用附加的行为来同步它们。作为纯 xaml 的解决方法,您可以隐藏虚线焦点矩形,从而消除问题。
  • @pushpraj 是的,这是我目前的解决方案。但我不确定这是最好的解决方案。如果可能的话,我希望只在 XAML 中解决而不添加扩展。
  • 尝试将空或空的焦点模板添加到列表框项。

标签: c# wpf xaml listbox


【解决方案1】:

我从我的同事那里找到了答案。通过使用当前选定项设置器(IsSelected 属性)触发 FocusManager.FocusedElement,问题得到解决。

        <ListBox.ItemContainerStyle>
            <Style TargetType="{x:Type ListBoxItem}">
                <!-- Edited: add pushpraj code to hide the dashed rectangle on focused item -->
                <Setter Property="FocusVisualStyle" Value="{x:Null}" /> 
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="FocusManager.FocusedElement" Value="{Binding RelativeSource={RelativeSource Self}}" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </ListBox.ItemContainerStyle>

【讨论】:

  • 我添加了隐藏虚线矩形焦点指示器的代码。我没有签入我的代码,因为我的同事会把它放在默认的 ListBox 样式上。
【解决方案2】:

如果您对焦点(虚线)矩形不感兴趣并且只对纯 xaml 解决方案感兴趣,那么您可能会隐藏它

这是一个示例

<ListBox>
    <ListBox.Resources>
        <Style TargetType="ListBoxItem">
            <Setter Property="FocusVisualStyle"
                    Value="{x:Null}" />
        </Style>
    </ListBox.Resources>
    <ListBoxItem>item 1</ListBoxItem>
    <ListBoxItem>item 2</ListBoxItem>
    <ListBoxItem>item 3</ListBoxItem>
</ListBox>

示例中有趣的区域是Style for ListBoxItem,它为FocusVisualStyle 设置了一个空值,通常是虚线矩形。

这不等同于将焦点元素与所选项目同步,但它隐藏了焦点层,因此虚线矩形不会出现。

【讨论】:

  • 这正是我隐藏破折号所需要的。 +1 给你。但这不是我问题的解决方案。例如,如果我们有按钮“AAA”、“BBB”、“CCC”、“DDD”和“EEE”。如果选定的项目按钮在“CCC”上但焦点项目/按钮在“AAA”上并且如果我们按下右箭头,我们预计下一个选定的按钮是“DDD”,因为焦点按钮是未知的并且标记为“CCC” ”。但结果是“BBB”。
  • 这是我害怕的事情。顺便说一句,您可以提供代码的工作示例,我可以尝试为您找到解决方案。
  • 感谢您的回答。但恐怕我不能分享我公司的代码。顺便说一句,我从我的同事那里得到了答案。但如果您有更好的解决方案,我将不胜感激。
  • 您可以将它们组合成一个样式,这就是您的完整解决方案,它隐藏了虚线矩形并解决了上述问题。
  • @YohanesNurcahyo 你能在这里分享你的解决方案吗?
猜你喜欢
  • 2014-10-09
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多