【问题标题】:Focusing a ListBoxItem doesn't update its styling聚焦 ListBoxItem 不会更新其样式
【发布时间】:2016-05-19 14:10:35
【问题描述】:

A 有一个 ListBox,需要在某些情况下(例如显示搜索结果时)关注特定项目。这是通过附加属性完成的,使用以下函数:

public static void OnElementIndexPropertyChanged (DependencyObject DObject, DependencyPropertyChangedEventArgs Args)
  {
  ListBox ListBoxControl = DObject as ListBox;

  if (ListBoxControl != null &&
      (int)Args.NewValue != -1)
    {
    ListBoxControl.ScrollIntoView (ListBoxControl.Items[(int)Args.NewValue]);
    ListBoxControl.UpdateLayout ();

    var ListBoxItem = (ListBoxItem)ListBoxControl.ItemContainerGenerator.ContainerFromItem (ListBoxControl.Items[(int)Args.NewValue]);
    ListBoxControl.SelectedItem = ListBoxItem;
    ListBoxItem.Focus ();
    }
  }

现在,ListBoxControl 确实获得了键盘焦点(如果我按住 Alt,它将在其周围显示一个虚线边框,并且它使用箭头键向上/向下移动它可以正常工作),但是,样式没有更新。最后选定的项目以蓝色突出显示,而新选定的项目未更新以显示蓝色突出显示。它只在第一次正常工作,在项目被聚焦和突出显示之前。

除了手动更改背景/样式之外,还有其他方法吗?

【问题讨论】:

    标签: c# wpf user-interface attached-properties


    【解决方案1】:

    我习惯于将SelectedItem 设置为实际项目,而不是该项目的容器。使用SelectedIndex 似乎也更自然,因为您已经有了索引。通过将SelectedItem 行替换为以下内容,我能够选择使用该样式的ListBox

    ListBoxControl.SelectedIndex = (int)Args.NewValue;

    附言

    我应该补充一点,也许我没有完全理解这个问题,因为我想知道为什么你不只是使用 SelectedIndex 而不是自定义附加属性来更改选择(可能是因为滚动不一样?)。

    【讨论】:

    • SelectedIndex 已设置,但未正确聚焦项目。所以我选择了附加属性方法。无论如何,您的内容让我意识到我将SelectedItem 设置为容器而不是内容。我使用了ListBoxItem.Content,现在它可以正常工作了。
    【解决方案2】:

    感谢@ChiuneSugihara,我意识到我将SelectedItem 设置为容器,而不是实际项目。换行

    ListBoxControl.SelectedItem = ListBoxItem;
    

    ListBoxControl.SelectedItem = ListBoxItem.Content;
    

    足以让它按预期工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-10
      • 2011-02-05
      • 2012-08-22
      相关资源
      最近更新 更多