【问题标题】:WPF Tunneling a Button_ClickWPF 为 Button_Click 建立隧道
【发布时间】:2011-10-24 20:15:59
【问题描述】:

这是我的第一个问题,所以请放轻松:)

我是 WPF 和基于桌面的应用程序的新手,我正在学习事件处理。通过冒泡和隧道,我在任何地方都找不到解释如何在 Button_Click 上使用隧道的示例。

基本上,当我单击按钮时,我需要父控件(在本例中为网格)首先处理事件并在允许 Button_Click 发生之前进行一些检查。我遇到的问题是我可以使用 Grid_PreviewMouseDown 来捕获事件,但这是不明确的!它没有告诉我(至少我认为它没有)是什么控制导致处理程序触发。

如何确定 PreviewMouseDown 是由按钮单击触发的?要么: 是否有替代/更好的方法是通过 Button_Click 隧道?

谢谢

【问题讨论】:

    标签: c# wpf routed-events tunneling


    【解决方案1】:

    在您的处理程序中,您应该检查事件的Source 以获取启动它的控件。请注意,它不是只读的,可以更改,因此 Source 指的是不同的控件。

    注册PreviewMouseLeftButtonDown 事件可能会更好地获得左键点击,而不仅仅是任何点击。

    如果您的处理程序只查找鼠标左键,您可以使用以下代码:

    private void Grid_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        Button button = e.Source as Button;
        if (button != null)
        {
            // button is being clicked, handle it
        }
    }
    

    【讨论】:

    • @Mrs:这取决于你的情况。如果您的处理程序将专门处理按钮单击,那么我更新中的代码就可以了。否则,如果您的处理程序将处理其他控件单击,则使用is 进行检查可能会更容易。
    • “object sender”参数是被点击的按钮,对吧?所以一个简单的“bool isAbutton = sender is Button;”会工作的。
    • @oXeNoN:不,在这种情况下不是。 sender 是注册事件的控件。在这种情况下,它注册在Grid 而不是Button 本身。 sender 指的是Grid
    猜你喜欢
    • 2011-03-31
    • 2016-03-27
    • 1970-01-01
    • 2015-05-05
    • 2020-09-14
    • 2020-08-25
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多