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

时间:2015-04-14 22:01:46

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

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

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

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

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

4 个答案:

答案 0 :(得分:15)

解决此问题的一种方法是使用行为(或类似行为的附加属性)订阅RequestBringIntoView的{​​{1}}事件,然后将ComboBoxItems设置为true 。 这也可以使用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; } 上的RequestBringIntoView事件而不是项目本身来获得相同的效果。但结果相同:

ItemsPanel

答案 1 :(得分:5)

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

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

答案 2 :(得分:2)

Andrew Hanlon选择的答案可以避免列表在打开时滚动到所选项目。 我还必须将它添加到事件处理程序中(“list”是ComboBox):

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;

    // Allows to bring the selected item into view:
    if (((ComboBoxItem)e.TargetObject).Content == list.SelectedItem)
        return;

    e.Handled = true;
}

答案 3 :(得分:0)

我在应用程序中遇到了同样的问题,因此我为组合框的PART_Popup设计了样式,以通过以下方式解决该问题:

<Popup x:Name="PART_Popup"
       IsOpen="{TemplateBinding IsDropDownOpen}"
       AllowsTransparency="True" 
       Focusable="False"
       PopupAnimation="Slide">

    <Grid MinWidth="{TemplateBinding ActualWidth}"
          MaxHeight="{TemplateBinding MaxDropDownHeight}">

        <Border x:Name="dropDownBorder"
                Background="White"
                BorderThickness="1"
                BorderBrush="Gray"
                Margin="0 2 0 0"/>

        <ScrollViewer SnapsToDevicePixels="True">
            <VirtualizingStackPanel IsItemsHost="True" 
                                    KeyboardNavigation.DirectionalNavigation="Contained" />
        </ScrollViewer>

    </Grid>
</Popup>

如果您在Margin中添加ScrollViewer(例如<ScrollViewer Margin="1" ...),它将开始自动向下滚动。