当 ComboBox
包含大量项目时,其下拉列表将变为可滚动。当用户调用此下拉菜单并移动鼠标光标以从底部进入下拉菜单的边界时,下拉菜单会立即向下滚动列表中的一个或多个项目(来自 goobering:通过底部退出边界时也会发生边缘)。
这种滚动不直观,因为从顶部进入边界时列表不会向上滚动。
我们如何禁用自动滚动行为?
在 Visual Studio 中,可以通过代码编辑器导航栏上的成员下拉列表 (CTRL+F2) 观察此行为。
最佳答案
解决这个问题的一种方法是使用行为(或者更确切地说是类似行为的附加属性)订阅 ComboBoxItems
的 RequestBringIntoView
事件,然后设置 RequestBringIntoViewEventArgs.Handled
为真。
这也可以使用 EventSetter
和代码隐藏在小范围内完成。
<Style TargetType="ComboBoxItem">
<EventSetter Event="RequestBringIntoView" Handler="OnRequestBringIntoView"/>
</Style>
private void OnRequestBringIntoView(object sender, RequestBringIntoViewEventArgs e)
{
//Allows the keyboard to bring the items into view as expected:
if (Keyboard.IsKeyDown(Key.Down) || Keyboard.IsKeyDown(Key.Up))
return;
e.Handled = true;
}
编辑
我发现您可以通过处理 ItemsPanel
上的 RequestBringIntoView 事件而不是项目本身来获得相同的效果。但结果相同:
<ComboBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel RequestBringIntoView="OnRequestBringIntoView"/>
</ItemsPanelTemplate>
</ComboBox.ItemsPanel>
关于c# - 当鼠标进入 WPF ComboBox 下拉列表时防止滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29638148/