當用戶單擊此控件時會觸發按鈕的單擊事件。 但這個事件可以通過代碼被解僱,例如:區分按鈕的點擊事件是由用戶操作還是從代碼觸發
myButton_Click(myButton, EventArgs.Empty)
我怎樣才能區分這兩個案件?
謝謝!
當用戶單擊此控件時會觸發按鈕的單擊事件。 但這個事件可以通過代碼被解僱,例如:區分按鈕的點擊事件是由用戶操作還是從代碼觸發
myButton_Click(myButton, EventArgs.Empty)
我怎樣才能區分這兩個案件?
謝謝!
創建一個派生自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
}
}
謝謝,我瞭解你的代碼。 但有可能不使用你的類,但以下的想法: 當我打電話從代碼按鈕的Click事件中,我用這個指令: myButton_Click(myButton的,EventArgs.Empty) 現在,當這個事件從發射一個真正的用戶點擊,EventsArg是空的還是不是? 因爲如果不是空的,我可以在單擊事件內部進行測試,如果eventArgs爲空或不是? 這個想法能工作嗎? 謝謝! – alex
您可以傳遞null作爲第二個參數,並在處理程序中檢查null。如果(e == null),但是,擴展類的優點是可以向該MyExtendedRoutedEventArgs添加任何屬性並檢查處理程序中的這些屬性。 – Vincent
任何你沒有投票的理由? – Vincent
正如所寫,通過反射檢查堆棧跟蹤很短,你可能運氣不好。
現在你/可以/通過創建一個新的子,做一個額外的參數,它會告訴你它是如何按下的實際工作重構它。事件處理程序可以調用新的子節點並傳遞一個值,表明它是通過事件觸發的,另一個「手動」調用可以傳遞一個值,表示它是由代碼調用的。然後新的子可以查看該值並採取所需的任何操作。
謝謝。但情況有點複雜。我有另一個事件讓我們說,執行按鈕的單擊事件時會觸發Event2。但是即使沒有按鈕的點擊事件,這個event2也可以被觸發。如果這種情況是真的,則在代碼中調用event2按鈕的click事件。所以通風口是相互依存的,我找不到其他方式,只是爲了區分點擊事件是由用戶單擊還是通過代碼觸發。 – alex
如果您真的渴望解決方案,您可以編程方式檢查堆棧跟蹤以查找調用幀(或者如果需要,可以後退多個幀),以查看調用是源自代碼還是源自框架。 「真實」按鈕點擊應該源自.NET框架內部。除非你沒有其他選擇,否則我不能推薦這樣做,這是一個嚴重的醜陋的黑客攻擊。 –
當您以編程方式調用它時,請將其他作爲發件人或參數傳遞給其他人。
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
}
}
我就不會是更容易創建,做工作的方法,並從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
謝謝,但正如我在上面的評論中所解釋的,情況有點複雜。我有另一個事件讓我們說,執行按鈕的單擊事件時會觸發Event2。但是即使沒有按鈕的點擊事件,這個event2也可以被觸發。如果這種情況是真的,則在代碼中調用event2按鈕的click事件。所以這些事件是相互依存的,我找不到其他方式,只是爲了區分點擊事件是由用戶單擊還是通過代碼觸發。 – alex
對不起,我真的不關注。你有2個事件。如果用戶點擊'myButton','Event1'被觸發,這個方法調用'Event2'方法。但是如果你的代碼中的某個地方調用了'Event2',這個方法必須調用'Event1''而不再調用'Event2'? –
我只有2個事件:按鈕的單擊事件和Event1。當用戶點擊按鈕時會觸發Event1。在這種情況下,我需要一種不在event1中運行一些代碼的方法。 Event1可以用另一種方式觸發,而不是用戶點擊按鈕。在這種情況下,按鈕的點擊事件被代碼調用。但是,如果是這種情況,在按鈕的單擊事件中,我需要一種方法來防止一些代碼運行。所以你可以看到所有的事情都取決於這個按鈕的事件是由代碼或用戶觸發的。 – alex
看一看[這裏](http://stackoverflow.com/questions/14630306/wpf-event-raised-by-ui-or-from-code)。 – Eminem
收到4個答案的問題,拿下2票。我無法理解。 – alex