Подтвердить что ты не робот

При использовании ScrollViewer в качестве части шаблона для некоторого элемента управления обрабатывается левый клик

Рассмотрим первую версию кода (MainWindow.xaml):

<ScrollViewer>
    <local:CustomControl1 Width="1000" Height="1000" Background="Red"/>
</ScrollViewer>

где CustomControl1 получен из ItemsControl. Внутри CustomControl1 я переопределяю событие OnMouseDown. Этот код работает отлично, и я действительно поймаю событие мыши.

Теперь вторая версия кода (MainWindow.xaml):

<local:CustomControl1 Width="1000" Height="1000" Background="Red"/>

Внутри Generic.xaml, я меняю шаблон элемента управления элементами:

            <ControlTemplate TargetType="{x:Type local:CustomControl1}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">

                    <ScrollViewer 
                        VerticalScrollBarVisibility="Visible" 
                        HorizontalScrollBarVisibility="Visible"
                        >
                        <ItemsPresenter/>
                    </ScrollViewer>
                </Border>
            </ControlTemplate>

Когда я помещаю scrollviewer как часть шаблона управления, я больше не получаю OnMouseDownEvent (для левого клика). По какой-то причине теперь событие мыши вниз отмечено как обработанное. Если вместо переопределения OnMouseDown я использую следующий оператор внутри конструктора управления элементами, событие выставляется:

AddHandler(Mouse.MouseDownEvent, new MouseButtonEventHandler(OnMouseDown), true);

Во-первых, я хотел бы понять, почему размещение scrollviewer внутри шаблона меняет поведение мыши. Во-вторых, знает ли кто-нибудь об обходном пути? Решение, которое я предложил (путем ловли обработанных событий), не приемлемо для меня. В моем приложении мне нужно обрабатывать события мыши, только если ни один из элементов не управляет дочерними элементами.

Спасибо заранее.

4b9b3361

Ответ 1

Если вы посмотрите, например, на ListBox по умолчанию Template (который также выводится из ItemsControl), вы увидите, что ScrollViewer имеет Focusable="False", установленный в шаблоне. Это позволяет событиям мыши проходить через ваше управление.

<ScrollViewer VerticalScrollBarVisibility="Visible"
              HorizontalScrollBarVisibility="Visible"
              Focusable="False" >
    <ItemsPresenter/>
</ScrollViewer>