当鼠标进入WPF ComboBox下拉列表时阻止滚动

Joe*_*ler 25 .net c# wpf combobox .net-4.5

当a ComboBox具有大量项目时,其下拉列表将变为可滚动.当用户调用此下拉列表,并移动鼠标光标以从底部输入下拉列表的边界时,下拉列表会立即向下滚动列表中的一个或多个项目(从goobering:当通过下边缘退出边界时也会发生).

此滚动不直观,因为从顶部输入边界时列表不会向上滚动.

我们如何禁用自动滚动行为?

在Visual Studio中,可以通过代码编辑器导航栏(CTRL+ F2)上的成员下拉列表观察到此行为.

And*_*lon 15

解决此问题的一种方法是使用行为(或类似行为的附加属性)来订阅RequestBringIntoView事件,ComboBoxItems然后将其设置RequestBringIntoViewEventArgs.Handled为true.这也可以使用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;            
}
Run Code Online (Sandbox Code Playgroud)

编辑

我发现你可以通过处理RequestBringIntoView事件ItemsPanel而不是项本​​身来获得相同的效果.但结果相同:

<ComboBox.ItemsPanel>
    <ItemsPanelTemplate>
        <StackPanel RequestBringIntoView="OnRequestBringIntoView"/>
    </ItemsPanelTemplate>
</ComboBox.ItemsPanel>
Run Code Online (Sandbox Code Playgroud)

  • @JoeGaggler我添加了一个简单的示例检查,看看是否按下了键盘上/下键.有趣的是,页面向上/向下工作没有检查. (2认同)

Bra*_*ner 5

据我所知,这似乎是由灯光底部的物品"部分显示"引起的,其中物品被容器截断.当鼠标移过像这样的部分项目时,WPF将整个项目滚动到视图中,这有时会在底部留下另一个部分项目.

在Winforms中,这可以通过设置来修复.IntegralHeight,但是我可以告诉WPF中不存在这样的属性.如果组合框中的所有项目具有相同的高度,则可以将组合框列表的高度绑定到项目高度的倍数,例如,显示10 x 20px高的项目,将其设置为200.