我有一个自定义列表框,它使用自定义面板作为 ItemsHost。我想控制鼠标滚轮输入,以便转动滚轮更改单个选定项目。
我相信最好的方法是处理 OnPreviewMouseWheel 事件(尽管这只是我想要的,因为它不提供水平轮数据)。
现在的大问题是:是否有处理 OnPreviewMouseWheel 的最佳实践?在 ListBox 中(默认情况下不知道 Panel 的子元素的排列)还是在 Panel 中(默认情况下不知道其子元素的“IsSelected”属性)?
我有一个自定义列表框,它使用自定义面板作为 ItemsHost。我想控制鼠标滚轮输入,以便转动滚轮更改单个选定项目。
我相信最好的方法是处理 OnPreviewMouseWheel 事件(尽管这只是我想要的,因为它不提供水平轮数据)。
现在的大问题是:是否有处理 OnPreviewMouseWheel 的最佳实践?在 ListBox 中(默认情况下不知道 Panel 的子元素的排列)还是在 Panel 中(默认情况下不知道其子元素的“IsSelected”属性)?
我认为你应该从ListBox
. ListBox
继承自Selector,它处理与选择有关的一切。
鼠标滚轮选择行为可以应用于任何类型Panel
(首先使用标准实现它甚至可能是一个好主意ListBox
),并且您可能希望使用选择逻辑没有意义的Panel
地方之外的某个地方。ListBox
它应该从 ListBox 完成,因为它只知道当前选择的项目。面板不想或不需要知道它是否被选中。
我建议将此作为附加行为实现,以便您可以多次重复使用该功能。
为此:
- 创建一个带有名为 MouseWheelChangesSelection (true/false) 的附加属性的新类(可能称为 ListBoxSelector)。
- 添加一个 PropertyNotifyChangedEvent 并在属性更改时为 PreviewMouseWheel / MouseWheel 事件注册一个事件侦听器。
您可以通过以下任一方式更改当前选定的项目:
- 增加选定的索引;或
- 使用集合视图源的 move prev/next