聚焦 ListBoxItem 不会更新其样式
Focusing a ListBoxItem doesn't update its styling
A 有一个列表框,需要在特定情况下(例如显示搜索结果时)聚焦特定项目。这是通过附加的 属性 使用以下函数完成的:
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,它将在其周围显示一个虚线边框,并且它使用箭头键移动 up/down 它可以正常工作),但是,样式是没有更新。最后选择的项目留下蓝色突出显示,而新选择的项目不会更新以显示蓝色突出显示。它只有在第一个项目被聚焦和突出显示之前才能正常工作。
除了手动更改 background/styling 之外,还有其他解决方法吗?
我习惯于将 SelectedItem
设置为实际项目而不是该项目的容器。使用 SelectedIndex
似乎也更自然,因为您已经有了索引。通过用以下代码替换 SelectedItem
行,我能够选择使用样式的 ListBox
:
ListBoxControl.SelectedIndex = (int)Args.NewValue;
P.S.
我应该补充一点,也许我没有完全理解这个问题,因为我想知道为什么你不只是使用 SelectedIndex
而不是附加的自定义 属性 来更改选择(也许因为滚动会不一样?)。
感谢@ChiuneSugihara,我意识到我正在将 SelectedItem
设置为容器,而不是实际项目。换行
ListBoxControl.SelectedItem = ListBoxItem;
至
ListBoxControl.SelectedItem = ListBoxItem.Content;
足以使其按预期工作。
A 有一个列表框,需要在特定情况下(例如显示搜索结果时)聚焦特定项目。这是通过附加的 属性 使用以下函数完成的:
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,它将在其周围显示一个虚线边框,并且它使用箭头键移动 up/down 它可以正常工作),但是,样式是没有更新。最后选择的项目留下蓝色突出显示,而新选择的项目不会更新以显示蓝色突出显示。它只有在第一个项目被聚焦和突出显示之前才能正常工作。
除了手动更改 background/styling 之外,还有其他解决方法吗?
我习惯于将 SelectedItem
设置为实际项目而不是该项目的容器。使用 SelectedIndex
似乎也更自然,因为您已经有了索引。通过用以下代码替换 SelectedItem
行,我能够选择使用样式的 ListBox
:
ListBoxControl.SelectedIndex = (int)Args.NewValue;
P.S.
我应该补充一点,也许我没有完全理解这个问题,因为我想知道为什么你不只是使用 SelectedIndex
而不是附加的自定义 属性 来更改选择(也许因为滚动会不一样?)。
感谢@ChiuneSugihara,我意识到我正在将 SelectedItem
设置为容器,而不是实际项目。换行
ListBoxControl.SelectedItem = ListBoxItem;
至
ListBoxControl.SelectedItem = ListBoxItem.Content;
足以使其按预期工作。