WPF: Canvas поглощает MouseDownEvent?

Кто-нибудь может объяснить мне, почему событиеMouseDownне достигаетScrollViewerв этом простом примере?

<Window x:Class="MouseDownTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ScrollViewer Name="scrollViewer" Background="Green" MouseDown="ScrollViewer_MouseDown" PreviewMouseDown="ScrollViewer_PreviewMouseDown">
            <Canvas Name="canvas" Background="Beige" MouseDown="Canvas_MouseDown" PreviewMouseDown="Canvas_PreviewMouseDown">
            </Canvas>
        </ScrollViewer>
    </Grid>
</Window>

код позади:

using System;
using System.Windows;
using System.Windows.Input;

namespace MouseDownTest
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            scrollViewer.AddHandler(MouseDownEvent, new RoutedEventHandler(ScrollViewer_Test));
        }

        private void ScrollViewer_Test(object sender, RoutedEventArgs routedEventArgs)
        {
            Console.WriteLine("ScrollViewer_Test");
        }

        private void Canvas_MouseDown(object sender, MouseButtonEventArgs e)
        {
            Console.WriteLine("Canvas_MouseDown");
        }

        private void Canvas_PreviewMouseDown(object sender, MouseButtonEventArgs e)
        {
            Console.WriteLine("Canvas_PreviewMouseDown");
        }

        private void ScrollViewer_MouseDown(object sender, MouseButtonEventArgs e)
        {
            Console.WriteLine("ScrollViewer_MouseDown");
        }

        private void ScrollViewer_PreviewMouseDown(object sender, MouseButtonEventArgs e)
        {
            Console.WriteLine("ScrollViewer_PreviewMouseDown");
        }
    }
}

Вывод при нажатии на холст

ScrollViewer_PreviewMouseDown
Canvas_PreviewMouseDown
Canvas_MouseDown

Почему значениеScrollViewer_MouseDownопущено? Я уже просмотрел эту статью, но приведенное там решение не помогает (или я сделал это неправильно).


person Hendrik    schedule 19.04.2013    source источник


Ответы (1)


Вам, вероятно, потребуется установить Focusable="False" на ScrollViewer, чтобы разрешить прохождение событий мыши.

 <ScrollViewer Name="scrollViewer" Focusable="False" Background="Green" />

Вывод:

ScrollViewer_PreviewMouseDown
Canvas_PreviewMouseDown
Canvas_MouseDown
ScrollViewer_MouseDown
person sa_ddam213    schedule 19.04.2013
comment
Вау, кажется, работает, спасибо! Кажется немного странным устанавливать свойство onScrollViewer, так как theCanvas кажется проглатывает событие... - person Hendrik; 19.04.2013
comment
Да, я не уверен, почему, но я думаю, что это связано с поведением ScrollViewer по умолчанию, я думаю, что он проглатывает событие, чтобы сфокусировать свое содержимое. Может быть, просто предположение. LOL - person sa_ddam213; 19.04.2013