当用户单击此控件时,会触发按钮的单击事件。 但是这个事件可以通过代码触发,例如:
myButton_Click(myButton, EventArgs.Empty)
我如何区分这两种情况?
谢谢!
答案 0 :(得分:1)
创建一个派生自RoutedEventArgs的新类,并在调用处理程序时传递该类。
public class MyExtendedRoutedEventArgs : RoutedEventArgs
{
public bool ICalled {set;get;}
}
MyButton_Click(MyButton, new ExtendedRoutedEventArgs(){ICalled=true});
private void MyButton_Click(object sender, RoutedEventArgs e)
{
if(e.getType() == typeof(MyExtendedRoutedEventArgs)
{
//you called it
}
}
答案 1 :(得分:0)
正如所写,如果没有通过反射检查堆栈跟踪,你可能会运气不好。
现在你/可以/通过创建一个新的子实体来重构它,它使用一个额外的参数来实际工作,该参数将告诉你它是如何被按下的。事件处理程序可以调用new sub并传递一个值,表示它是通过事件触发的,另一个是" manual" call可以传递一个值,表示它已被您的代码调用。然后,新子可以查看值并采取它需要的任何操作。
答案 2 :(得分:0)
当您以编程方式调用它时,将其他内容作为发件人或args传递。
enter code here
myButton_Click("I called it",null);
myButton_Click(object sender, RoutedEventArgs e)
{
//Check the value of sender here
if(sender.ToString() == "I called it" )
{
//You know you called it
}
}
答案 3 :(得分:0)
创建一个完成工作的方法并从Click
事件和/或代码中的任何其他位置调用它会更容易吗?
Private Sub DoTheThing(ByVal calledFromCode as boolean, ByVal sender as object)
'Do the work here
End Sub
Private Sub myButton_Click(ByVal sender As Object, ByVal e As EventArgs)
DoTheThing(false, sender)
End Sub
Private Sub SomeOtherMethod()
DoTheThing(true, myButton)
End Sub