禁用可编辑ComboBox中的MouseWheel作为ItemTemplate

时间:2012-11-07 14:29:28

标签: wpf combobox listbox mousewheel itemtemplate

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

任何想法?

5 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分: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);
}

答案 2 :(得分:2)

我用行为(和@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
            });
        }
    }
}

答案 3 :(得分: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);
}

答案 4 :(得分:0)

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

在这种情况下你能考虑这样的样本吗? creating a Font Box也是如此。

进一步参考: 你可以查看这个MSDN article吗?