2013-12-17 44 views
3

我有一个非常简单的应用程序,但它是一个问题。我有一个按钮(在网格上),我想知道,当用户在运行时点击它时,用户点击了按钮(X,Y坐标)的哪一部分。现在,我无法在Click事件处理程序中跟踪鼠标位置,因为它的参数“e”是类型“RoutedEventArgs”,并且它没有给出发生鼠标点击的位置。Wpf应用程序没有正确响应事件

因此我尝试了其他事件处理程序“MouseLeftButtonDown”事件。这有一个参数“e”,它给出了一个GetPosition()方法,可以给鼠标指针的位置。但问题是,在运行时,当我点击按钮时,这个事件处理程序根本不会被调用!这里是我的两个事件处理程序代码:

private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     string sName = sender.GetType().Name; 
     string sSrc = e.Source.ToString(); 
     string soSrc = e.OriginalSource.ToString(); 

     MessageBox.Show("Sender Name: " + sName + ",\nSource: " + sSrc + ",\nOrigSource: " + soSrc + ",\nevent:" + e.RoutedEvent.ToString()); 
    } 

    private void button1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     string sName = sender.GetType().Name; 
     string sSrc = e.Source.ToString(); 
     string soSrc = e.OriginalSource.ToString(); 
     textBox1.Text = "LeftButtonPressed on button1"; 
    } 

如果我只保留点击事件处理程序,它的工作原理。如果我只保留MouseLeftButtonDown事件处理程序,它不起作用。如果我保持这两者,那么只有Click事件处理程序被调用!任何人都可以帮忙吗?

在此先感谢。

+0

删除messagebox –

回答

0

Button控件将MouseLeftButtonDown事件吞并(标记为“已处理”)事件作为其Click事件的一部分。它可以添加一个监听器,即使事件已经处理了一个触发,你这样做:

button1.AddHandler(Button.MouseLeftButtonDownEvent, 
    new MouseButtonEventHandler(button1_MouseLeftButtonDown), 
    true // also capture handled events 
); 

或者,你可以继承Button并覆盖其OnMouseLeftButtonDown事件:

public class ExtendedButton : Button 
{ 
    protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) 
    { 

    } 
} 
+0

好的,你能否请详细解释一下按钮的MouseLeftButtonDown和MouseLeftButtonUp事件会发生什么?如果Click事件吞噬了这些事件,如果我们想要鼠标按钮事件和鼠标按钮事件的不同功能,我们该怎么办?任何帮助将不胜感激。 – user2755525

+0

@ user2755525正如我在答案中所提到的那样,您可以随时在代码中手动添加处理程序(我认为您可以从XAML中添加“处理事件太”侦听器)。我只是添加了另一种选择 - “Button”为鼠标左键提供了一个保护覆盖,所以你可以创建一个子类并以这种方式处理它。 – McGarnagle

+0

非常感谢您的帮助。我会尝试这些选项。再次感谢。 – user2755525