带键盘问题的Wpf ListBox滚动

时间:2011-03-08 16:13:56

标签: wpf wpf-controls

好的,我有一个列表框,并为listboxitem定义了一个触发器,如下所示:

 <DataTrigger Binding="{Binding IsMouseOver,RelativeSource={RelativeSource Self}}" Value="True">
   <Setter Property="IsSelected" Value="True" />
  </DataTrigger>

只要我将鼠标移到listboxitem上,它就会被选中。当我尝试用键盘向下箭头滚动列表时出现问题。 因此,假设我的鼠标位于列表中的第三个项目上,默认情况下已选中。现在,当我按下向下箭头时,第一个项目被选中!此外,当我按下向下箭头时,只有当选择移动到之前不在视图中的项目时,只有可视列表才能正确滚动,选择将被放回到鼠标所在的项目上并且滚动从那里!...换句话说,当鼠标完全不在列表框上时,键盘滚动工作正常......我真的希望自己清楚。

我可能在这里做些傻事,欢迎提出任何建议 感谢

1 个答案:

答案 0 :(得分:0)

哇,这是一个最有趣的触发器:)

此行为是预期的,因为所选项目由ListBoxItem聚焦,并且当ScrollBar更新鼠标下方新项目的IsMouseOver属性更改时。

如果同时进行键盘选择,您基本上需要禁用选择鼠标下的项目:

黑客警告:

EventManager.RegisterClassHandler(typeof(ListBoxItem), ListBoxItem.SelectedEvent, new RoutedEventHandler(
            (s, e) => e.Handled = (Keyboard.IsKeyDown(Key.Down) || Keyboard.IsKeyDown(Key.Up)) && (s as FrameworkElement).IsMouseOver), true);

将上述内容放在任何静态构造函数中。它很粗糙但对我有用。