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

3
我有一个非常简单的应用程序,但它出现了问题。我有一个按钮(在网格上),我想知道当用户在运行时单击它时,用户单击了按钮的哪个部分(X,Y坐标)。现在,我无法在单击事件处理程序中跟踪鼠标位置,因为它的参数“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";
    }

如果我只保留点击事件处理程序,它就有效。如果我只保留MouseLeftButtonDown事件处理程序,它就无效。如果两个都保留,那么只有点击事件处理程序被调用!请问有人可以帮忙吗?谢谢!

删除消息框 - Federico Berasategui
1个回答

0

Button控件在其Click事件中吞噬(标记为“已处理”)MouseLeftButtonDown事件。可以添加一个监听器,即使事件已被处理也会触发它,可以像这样操作:

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)
    {

    }
}

好的,您能否稍微详细解释一下,对于一个按钮,MouseLeftButtonDown和MouseLeftButtonUp事件会发生什么?如果Click事件吞噬了这些事件,如果我们希望鼠标按钮上升和鼠标按钮下降事件具有不同的功能,我们该怎么办?任何帮助都将不胜感激。 - user2755525
正如我在答案中提到的那样,您可以在代码中手动添加处理程序(我认为您无法从XAML添加"handled-events-too"监听器)。我刚刚添加了另一种替代方案——Button提供了一个受保护的重写左鼠标单击的方法,因此您可以创建一个子类并以这种方式处理它。 - McGarnagle
非常感谢您的帮助。我会尝试这些选项。再次感谢。 - user2755525
@user2755525 没问题。回答你的另一个问题——注意到 RoutedEventArgs 有一个 Handled 属性可能会有所帮助。通常,处理程序会设置 args.Handled=true,以便其他控件不会重复处理它。这就是 Button 控件所做的,同时也会引发自己的 Click 事件。 - McGarnagle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接