отключите колесо мыши на itemscontrol в wpf

У меня есть usercontrol, который имеет scrollviewer, затем набор дочерних элементов управления как текстовые поля, переключатели и поля списков, и т.д. в нем. Я могу использовать колесо мыши для прокрутки родителя scrollviewer, пока мои земли мыши в поле списка затем, события колесика мыши не начинают идти в поле списка. там какой-либо путь состоит в том, чтобы иметь поле списка, передают те события обратно до родительского управления? при удалении поля списка из стороны, которую предлагает родительское управление как этот вопрос (Колесо мыши, не работающее, когда по дочерним элементам управления ScrollViewer), не решение.

Я попробовал

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

но это не работало также.

Спасибо

26
задан Community 23 May 2017 в 12:34
поделиться

2 ответа

Ответ, на который вы ссылаетесь, и является причиной вашей проблемы: ListBox (который состоит, среди прочего, из ScrollViewer) внутри вашего ScrollViewer улавливает событие MouseWheel и обрабатывает его, предотвращая его всплытие, и, следовательно, ScrollViewer не идея, что событие когда-либо произошло.

Используйте следующий чрезвычайно простой ControlTemplate для вашего ListBox, чтобы продемонстрировать его (обратите внимание, что в нем нет ScrollViewer, и поэтому событие MouseWheel не будет перехвачено) ScrollViewer по-прежнему будет прокручивать с помощью мыши над ListBox.

<UserControl.Resources>
     <ControlTemplate x:Key="NoScroll">
         <ItemsPresenter></ItemsPresenter>
     </ControlTemplate>
</UserControl.Resources>

<ScrollViewer>
    <SomeContainerControl>
        <.... what ever other controls are inside your ScrollViewer>
        <ListBox Template="{StaticResource NoScroll}"></ListBox>
    <SomeContainerControl>
</ScrollViewer>

У вас есть возможность захвата мыши, когда она входит в ScrollViewer, хотя, чтобы он продолжал получать все события мыши до тех пор, пока мышь не будет отпущена, однако эта опция потребует, чтобы вы отправляли любые дальнейшие события мыши в элементы управления, содержащиеся в ScrollViewer, если вам нужен ответ ... следующих обработчиков событий MouseEnter MouseLeave будет достаточно.

private void ScrollViewerMouseEnter(object sender, MouseEventArgs e)
{
    ((ScrollViewer)sender).CaptureMouse();
}

private void ScrollViewerMouseLeave(object sender, MouseEventArgs e)
{
    ((ScrollViewer)sender).ReleaseMouseCapture();
}

Однако ни один из предложенных мной обходных путей не является предпочтительным, и я бы посоветовал переосмыслить то, что вы на самом деле пытаетесь сделать. Если вы объясните, чего вы пытаетесь достичь в своем вопросе, я уверен, что вы получите еще несколько предложений ...

35
ответ дан 28 November 2019 в 06:11
поделиться

Как сказал Саймон, это ScrollViewer в стандартном шаблоне списка, который ловит событие. Чтобы обойти его, вы можете предоставить свой собственный шаблон.

<ControlTemplate x:Key="NoWheelScrollListBoxTemplate" TargetType="ListBox">
    <Border BorderThickness="{TemplateBinding Border.BorderThickness}" Padding="1,1,1,1" BorderBrush="{TemplateBinding Border.BorderBrush}" Background="{TemplateBinding Panel.Background}" Name="Bd" SnapsToDevicePixels="True">
        <!-- This is the new control -->
        <l:NoWheelScrollViewer Padding="{TemplateBinding Control.Padding}" Focusable="False">
            <ItemsPresenter SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
        </l:NoWheelScrollViewer>
    </Border>
    <ControlTemplate.Triggers>
        <Trigger Property="UIElement.IsEnabled" Value="False">
            <Setter TargetName="Bd" Property="Panel.Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />
        </Trigger>
        <Trigger Property="ItemsControl.IsGrouping" Value="True">
            <Setter Property="ScrollViewer.CanContentScroll" Value="False" />
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

И реализация для NowheelscrollViewer довольно проста.

public class NoWheelScrollViewer : ScrollViewer
{
    protected override void OnMouseWheel(MouseWheelEventArgs e)
    {
        // Do nothing
    }
}

Затем, когда вы хотите список списка, чтобы не обрабатывать колесо мыши.

<ListBox Template="{StaticResource NoWheelScrollListBoxTemplate}">
9
ответ дан 28 November 2019 в 06:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: