【问题标题】:Wpf Application not properly responding to eventsWpf 应用程序未正确响应事件
【发布时间】:2013-12-18 04:27:56
【问题描述】:

我有一个非常简单的应用程序,但它给出了一个问题。我有一个按钮(在网格上),我想知道,当用户在运行时单击它时,用户单击了按钮的哪一部分(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";
    }

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

提前致谢。

【问题讨论】:

  • 删除消息框

标签: c# wpf


【解决方案1】:

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

    }
}

【讨论】:

  • 好的,您能否更详细地解释一下按钮的 MouseLeftButtonDown 和 MouseLeftButtonUp 事件会发生什么?如果 Click 事件吞噬了这些事件,如果我们想要鼠标按钮向上和鼠标按钮向下事件的不同功能,我们该怎么办?任何帮助将不胜感激。
  • @user2755525 正如我在答案中提到的,您始终可以在代码中手动添加处理程序(我认为您不能从 XAML 添加“handled-events-too”侦听器)。我刚刚添加了另一种选择——Button 为鼠标左键单击提供了一个受保护的覆盖,因此您可以创建一个子类并以这种方式处理它。
  • 非常感谢您的帮助。我会尝试这些选项。再次感谢。
  • @user2755525 没有问题。为了解决您的其他问题——注意RoutedEventArgs 具有Handled 属性可能会有所帮助。通常,处理程序将设置args.Handled=true,以便其他控件不会对它进行双重处理。这就是Button 控件所做的事情,并且还会引发它自己的Click 事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多