假设我有这个函数声明:
private void ToggleButton_Checked(object sender, System.Windows.RoutedEventArgs e)
此功能可以通过用户点击和其他功能的代码内部触发。 我希望检查用户点击何时触发此功能,如何?
答案 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.
}