后台
我需要防止ComboBox
滚动(使用滚轮),当它是focused
。
但是,我需要它的父UIElement
仍然滚动。
我从这个问题中得到了以下代码,它可以防止 * 任何 * 滚动,包括父UIElement
的滚动。
代码
<ComboBox comboBox:NoScrollingBehaviour.Enabled="True"
IsEditable="True"
IsTextSearchEnabled="True"
IsTextSearchCaseSensitive="False"
StaysOpenOnEdit="True"
Text="{Binding MyTextProperty}"
ItemsSource="{Binding DataContext.MySourceProperty, ElementName=MyElementName}"/>
using System.Windows;
using System.Windows.Input;
namespace AE.UI.ComboBox
{
public static class NoScrollingBehaviour
{
public static readonly DependencyProperty EnabledProperty =
DependencyProperty.RegisterAttached("Enabled", typeof(bool), typeof(NoScrollingBehaviour),
new UIPropertyMetadata(false, OnEnabledChanged));
public static bool GetEnabled(System.Windows.Controls.ComboBox comboBox) => (bool)comboBox.GetValue(EnabledProperty);
public static void SetEnabled(System.Windows.Controls.ComboBox comboBox, bool value) => comboBox.SetValue(EnabledProperty, value);
private static void OnEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var comboBox = (System.Windows.Controls.ComboBox)d;
if (GetEnabled(comboBox))
comboBox.PreviewMouseWheel += OnPreviewMouseWheel;
}
private static void OnPreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
var comboBox = (System.Windows.Controls.ComboBox)sender;
if (!GetEnabled(comboBox))
return;
if (comboBox.IsDropDownOpen)
return;
e.Handled = true;
}
}
}
问题
如何允许父UIElement
滚动,同时仍然阻止ComboBox
滚动?
1条答案
按热度按时间ego6inou1#
我可以使用下面的代码来传播它
注意:您可能需要缩放
e.Delta
(我要求缩放0.4
,但我不确定这是否在任何地方都相同)