c# - 当鼠标进入 WPF ComboBox 下拉列表时防止滚动

标签 c# .net wpf combobox .net-4.5

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

这种滚动不直观,因为从顶部进入边界时列表不会向上滚动。

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

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

最佳答案

解决这个问题的一种方法是使用行为(或者更确切地说是类似行为的附加属性)订阅 ComboBoxItemsRequestBringIntoView 事件,然后设置 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/

相关文章:

c# - 立即取消所有正在运行的C# Parallel.Foreach 线程

c# - 如何使用 .net 为 DB2 的 sql 语句定义终止符

c# - 在进行一些密集计算之前等待多个快速属性更改事件 (C#)

c# - 将 MemoryCache 内容持久化到文件

c# - 如何从 Windows 服务发送电子邮件?

C# 数据类型和数组

c# - 从 WPF 中的一个 UserControl 中的 PropertyChanged 命令更新其他 ViewModel 和容器表单

c# - 是否可以更改 Extended WPF Toolkit 的 Busyindicator 中的忙碌动画?

wpf - Windows Phone 用户控件不会在 ListBox 中拉伸(stretch)

c# - NameValueCollection Equals 方法是否比较两个集合是否具有相同的键值对?