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