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