Wpf应用程序未正确响应事件

时间:2013-12-17 17:23:45

标签: c# wpf

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

因此我尝试了另一个事件处理程序,即“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";
    }

如果我只保留click事件处理程序,它就可以了。如果我只保留MouseLeftButtonDown事件处理程序,则它不起作用。如果我保留两者,那么只调用Click事件处理程序!有人可以帮忙吗?

提前致谢。

1 个答案:

答案 0 :(得分: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)
    {

    }
}