检查用户点击是否触发了某个事件?

时间:2017-07-13 21:04:52

标签: c# wpf

假设我有这个函数声明:

private void ToggleButton_Checked(object sender, System.Windows.RoutedEventArgs e)

此功能可以通过用户点击和其他功能的代码内部触发。 我希望检查用户点击何时触发此功能,如何?

2 个答案:

答案 0 :(得分:1)

只需不调用用户代码中的事件,就可以完全消除对问题的需求。

事件处理程序存在...处理事件。因此,将事件中的逻辑提取到自己的方法中:

private void ToggleButton_Checked(object sender, System.Windows.RoutedEventArgs e)
{
    DoTheThing(userInitiated: true);
}

private void DoTheThing(bool userInitiated)
{
    if (userInitiated)
    {
        // ...
    }
    else
    {
        // ...
    }
}

然后你可以从代码中调用相同的方法:

DoTheThing(userInitiated: false);

答案 1 :(得分:0)

一种方法无法分辨谁叫它。但在这里,你有一个sender参数。如果用户单击调用该方法,则发件人将是用户单击的ToggleButton。如果您在代码中调用此方法,请传递不同的内容。例如。打电话的对象:

// Call in code
ToggleButton_Checked(this, e);

ToggleButton_Checked

if (sender is ToggleButton) {
    // User click
} else {
    // Called from code
}

注意:如果您正在调用ToggleButton_Checked,则不会触发任何事件,而只是调用事件处理程序。

我认为您可能遇到的问题(您没有解释)是您正在更改控件的Checked属性,但不希望在这种情况下触发事件处理程序。 / p>

你可以通过使用后卫来实现这一目标

private bool _changing; // Field

执行更改的代码:

_changing = true;
try {
   myToggleButton.Checked = someNewValue;
} finally {
    _changing = false;
}

在事件处理程序ToggleButton_Checked中,用

括起您的代码
if (!_changing) {
    // Your code handler stuff.
}