2013-04-19 3 views
2

Может ли кто-нибудь объяснить мне, почему событие MouseDown не достигает ScrollViewer в этом удобном примере?WPF: Холст глотает MouseDownEvent?

<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 опущены? Я уже рассмотрел this article, но решение, данное там, не помогает (или я сделал это неправильно).

ответ

1

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

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

Выход:

ScrollViewer_PreviewMouseDown 
Canvas_PreviewMouseDown 
Canvas_MouseDown 
ScrollViewer_MouseDown 
+0

Ого, кажется, работает, спасибо! Кажется немного странным, однако, чтобы установить свойство на 'ScrollViewer '' на 'Canvas'seems проглотить событие ... – Hendrik

+0

Да, я не уверен, почему, но я думаю, что это связано с поведением по умолчанию ScrollViewer, я думаю, что он проглатывает событие, чтобы сфокусировать его контент. Может быть, просто гадать. LOL –