При использовании ScrollViewer как части шаблона для какого-либо элемента управления, левый щелчок обрабатывается - PullRequest
13 голосов
/ 14 августа 2011

Рассмотрим первую версию кода (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 I внутри конструктора элемента управления используется следующий оператор, событие перехватывается:

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

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

Заранее спасибо.

1 Ответ

23 голосов
/ 14 августа 2011

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

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