Отключить MouseWheel в редактируемом ComboBox как ItemTemplate

Я использую ComboBox как ItemTemplate внутри ListBox. Мой ComboBox доступен для редактирования. Когда пользователь использует колесо мыши в поле со списком, оно меняет текущее значение. Я не хочу этого. Я хочу, чтобы ListBox прокручивался. Есть ли какое-нибудь решение для этого? Большинство примеров, которые я нашел, основаны только на ComboBox только для чтения. Кажется, ни одно из решений, которые я нашел, не работает. переопределить параметр OnMouseWheel isHandled = true не работает, кажется, событие обрабатывается в других местах. Я безуспешно пытался переопределить OnMouseWheel в TextBox, используемом ControlTemplate моего ComboBox.

Любые идеи ?


person droopy6    schedule 07.11.2012    source источник


Ответы (5)


Хорошо, моя ошибка, я поместил PreviewMouseWheel на неправильный UIElement моего ItemTemplate. Итак, это работает:

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

Тем не менее, "parentListBox.RaiseEvent(args);" не работает.

person droopy6    schedule 08.11.2012

Однажды я решил аналогичную проблему со следующим подходом:

ВПФ:

<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);
}
person XamlZealot    schedule 07.11.2012
comment
это не работает с редактируемым полем со списком. Я даже не попадаю в обработчик. - person droopy6; 07.11.2012

Я решил вашу проблему с помощью поведения (и логики, предоставленной @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
            });
        }
    }
}
person Lyra    schedule 06.05.2016

Попробуйте зарегистрировать обработчик класса в своем конструкторе:

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);
}
person XamlZealot    schedule 07.11.2012
comment
PreviewMouseWheel делает свое дело, но это не работает с моими стилями со списком. Если я тестирую простой проект, колесико мыши отключено должным образом. - person droopy6; 08.11.2012
comment
черт, это работает вне моего проекта, с моими стилями! Я не понимаю, почему это не работает... - person droopy6; 08.11.2012

Правильно ли сказать, что наш случай похож на окно списка шрифтов на панели инструментов: выбор нового шрифта, где ранее выбранный шрифт по-прежнему отображается как выбранное значение, но вы можете прокручивать его по вертикали?

В таком случае вы можете рассмотреть такой образец? создание окна шрифтов.

Дополнительная ссылка: не могли бы вы проверить эту статью MSDN?

person bonCodigo    schedule 07.11.2012