我们的WPF应用程序有一个包含各种控件的ScrollViewer。当打开带有此ScrollViewer的组合框,然后用户使用鼠标滚轮滚动ScrollViewer时,组合框控件会移动,但下拉列表仍保持在同一位置,这看起来很尴尬。
当ScrollViewer滚动并更改组合框位置时,是否有一种简单的方法可以使组合框关闭,或下拉列表的位置更新?
我知道我可以处理鼠标滚轮事件,但是我有很多这样的情况,ScrollViewer中包含一个组合框,并且很想听听更好的解决方案。
答案 0 :(得分:0)
您可以处理ScrollChanged
的{{1}}事件并强制ScollViewer
关闭DropDown菜单:
XAML
ComboBox
并在后面的代码中:
<ScrollViewer VerticalAlignment="Stretch" HorizontalAlignment="Stretch" ScrollChanged="ScrollViewer_OnScrollChanged">
<Grid Height="700">
<ComboBox x:Name="comboBox" VerticalAlignment="Center" HorizontalAlignment="Center">
<ComboBoxItem Content="Elt One"/>
<ComboBoxItem Content="Elt Two"/>
<ComboBoxItem Content="Elt Three"/>
</ComboBox>
</Grid>
</ScrollViewer>
答案 1 :(得分:0)
我通过在App.xaml.cs中添加以下代码来处理它:
EventManager.RegisterClassHandler(typeof(ComboBox), UIElement.GotFocusEvent, new RoutedEventHandler(SetSelectedComboBox));
EventManager.RegisterClassHandler(typeof(ScrollViewer), UIElement.MouseWheelEvent, new MouseWheelEventHandler(OnMouseWheelEvent));
private static WeakReference<ComboBox> _selectedComboBox;
private static void SetSelectedComboBox(object sender, RoutedEventArgs e)
{
_selectedComboBox = new WeakReference<ComboBox>(sender as ComboBox);
}
// Close dropdown when scrolling with the mouse wheel - QM001866525
private static void OnMouseWheelEvent(object sender, MouseWheelEventArgs e)
{
if (_selectedComboBox == null || Environment.GetEnvironmentVariable("DONT_CLOSE_COMBO_ON_MOUSE_WHEEL") == "1")
{
return;
}
ComboBox combo;
if (_selectedComboBox.TryGetTarget(out combo) && combo.IsDropDownOpen)
{
combo.IsDropDownOpen = false;
}
}