8

我在 ListBox 中使用 ComboBox 作为 ItemTemplate。我的 ComboBox 是可编辑的。当用户在组合框中使用鼠标滚轮时,它会更改当前值。我不想要那个。我希望 ListBox 滚动。有什么解决办法吗?我发现的大多数示例仅基于只读 ComboBox。似乎我找到的解决方案都不起作用。覆盖 OnMouseWheel 设置 isHandled = true 不起作用,似乎该事件在其他地方处理。我试图在我的 ComboBox 的 ControlTemplate 使用的 TextBox 中覆盖 OnMouseWheel ,但没有成功。

有任何想法吗 ?

4

5 回答 5

8

好的,我的错误,我将 PreviewMouseWheel 放在了我的 ItemTemplate 的错误 UIElement 上。所以这是有效的:

private void myCombo_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
    e.Handled = true;
}

尽管如此,“parentListBox.RaiseEvent(args);” 不起作用。

于 2012-11-08T10:45:48.480 回答
3

我用行为(以及@XamlZealot 提供的逻辑)解决了您的问题:

internal class ComboBoxIsNotScrollingItemsBehavior : Behavior<ComboBox>
{
    protected override void OnAttached()
    {
        this.AssociatedObject.PreviewMouseWheel += this.ComboBox_PreviewMouseWheel;
    }

    protected override void OnDetaching()
    {
        this.AssociatedObject.PreviewMouseWheel -= this.ComboBox_PreviewMouseWheel;
    }

    private void ComboBox_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
    {
        if (this.AssociatedObject.IsDropDownOpen == false)
        {
            e.Handled = true;

            ((FrameworkElement)this.AssociatedObject.Parent).RaiseEvent(new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta)
            {
                RoutedEvent = UIElement.MouseWheelEvent,
                Source = sender
            });
        }
    }
}
于 2016-05-06T18:36:32.547 回答
2

我曾经用以下方法解决了一个类似的问题:

WPF:

<ComboBox MouseWheel="ComboBox_MouseWheel"/>

C#:

private void ComboBox_MouseWheel(object sender, MouseWheelEventArgs e)
{
    e.Handled = true;
    MouseWheelEventArgs args = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta);
    args.RoutedEvent = UIElement.MouseWheelEvent;
    args.Source = sender;
    parentListBox.RaiseEvent(args);
}
于 2012-11-07T15:19:39.503 回答
1

尝试在构造函数中注册一个类处理程序:

EventManager.RegisterClassHandler(typeof(ComboBox), ComboBox.MouseWheelEvent, new RoutedEventHandler(MouseWheeled));

private void MouseWheeled(object Sender, RoutedEventArgs e)
{
    MouseWheelEventArgs mouseArgs = (MouseWheelEventArgs)e;
    e.Handled = true;
    MouseWheelEventArgs args = new MouseWheelEventArgs(mouseArgs.MouseDevice, mouseArgs.Timestamp, mouseArgs.Delta);
    args.RoutedEvent = UIElement.MouseWheelEvent;
    args.Source = Sender;
    parentListBox.RaiseEvent(args);
}
于 2012-11-07T16:03:17.867 回答
0

说我们的情况是正确的吗,工具栏中的字体列表框:选择一种新字体,以前选择的字体仍然显示为选定的值,但您可以垂直滚动?

在那种情况下,您可以考虑这样的样本吗?也创建一个字体框

进一步参考:您可以查看这篇MSDN 文章吗?

于 2012-11-07T15:41:07.543 回答