2015-04-06 26 views
-1

當用戶單擊此控件時會觸發按鈕的單擊事件。 但這個事件可以通過代碼被解僱,例如:區分按鈕的點擊事件是由用戶操作還是從代碼觸發

myButton_Click(myButton, EventArgs.Empty) 

我怎樣才能區分這兩個案件?

謝謝!

+0

看一看[這裏](http://stackoverflow.com/questions/14630306/wpf-event-raised-by-ui-or-from-code)。 – Eminem

+0

收到4個答案的問題,拿下2票。我無法理解。 – alex

回答

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 
    } 
} 
+0

謝謝,我瞭解你的代碼。 但有可能不使用你的類,但以下的想法: 當我打電話從代碼按鈕的Click事件中,我用這個指令: myButton_Click(myButton的,EventArgs.Empty) 現在,當這個事件從發射一個真正的用戶點擊,EventsArg是空的還是不是? 因爲如果不是空的,我可以在單擊事件內部進行測試,如果eventArgs爲空或不是? 這個想法能工作嗎? 謝謝! – alex

+0

您可以傳遞null作爲第二個參數,並在處理程序中檢查null。如果(e == null),但是,擴展類的優點是可以向該MyExtendedRoutedEventArgs添加任何屬性並檢查處理程序中的這些屬性。 – Vincent

+0

任何你沒有投票的理由? – Vincent

0

正如所寫,通過反射檢查堆棧跟蹤很短,你可能運氣不好。

現在你/可以/通過創建一個新的子,做一個額外的參數,它會告訴你它是如何按下的實際工作重構它。事件處理程序可以調用新的子節點並傳遞一個值,表明它是通過事件觸發的,另一個「手動」調用可以傳遞一個值,表示它是由代碼調用的。然後新的子可以查看該值並採取所需的任何操作。

+0

謝謝。但情況有點複雜。我有另一個事件讓我們說,執行按鈕的單擊事件時會觸發Event2。但是即使沒有按鈕的點擊事件,這個event2也可以被觸發。如果這種情況是真的,則在代碼中調用event2按鈕的click事件。所以通風口是相互依存的,我找不到其他方式,只是爲了區分點擊事件是由用戶單擊還是通過代碼觸發。 – alex

+0

如果您真的渴望解決方案,您可以編程方式檢查堆棧跟蹤以查找調用幀(或者如果需要,可以後退多個幀),以查看調用是源自代碼還是源自框架。 「真實」按鈕點擊應該源自.NET框架內部。除非你沒有其他選擇,否則我不能推薦這樣做,這是一個嚴重的醜陋的黑客攻擊。 –

0

當您以編程方式調用它時,請將其他作爲發件人或參數傳遞給其他人。

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 
    } 
} 
+0

好的,但我需要發件人作爲對象,因爲我使用它的一些屬性和.tag值。你能解釋我怎麼做,而不改變發件人,但有一些參數? – alex

+0

myButton。(property)除非您對多個按鈕使用相同的處理程序。 – Vincent

+0

只要您只爲一個按鈕使用'myButton_Click'方法,您就可以直接通過它的名稱訪問控件,而不需要'sender'變量。 –

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 
+0

謝謝,但正如我在上面的評論中所解釋的,情況有點複雜。我有另一個事件讓我們說,執行按鈕的單擊事件時會觸發Event2。但是即使沒有按鈕的點擊事件,這個event2也可以被觸發。如果這種情況是真的,則在代碼中調用event2按鈕的click事件。所以這些事件是相互依存的,我找不到其他方式,只是爲了區分點擊事件是由用戶單擊還是通過代碼觸發。 – alex

+0

對不起,我真的不關注。你有2個事件。如果用戶點擊'myButton','Event1'被觸發,這個方法調用'Event2'方法。但是如果你的代碼中的某個地方調用了'Event2',這個方法必須調用'Event1''而不再調用'Event2'? –

+0

我只有2個事件:按鈕的單擊事件和Event1。當用戶點擊按鈕時會觸發Event1。在這種情況下,我需要一種不在event1中運行一些代碼的方法。 Event1可以用另一種方式觸發,而不是用戶點擊按鈕。在這種情況下,按鈕的點擊事件被代碼調用。但是,如果是這種情況,在按鈕的單擊事件中,我需要一種方法來防止一些代碼運行。所以你可以看到所有的事情都取決於這個按鈕的事件是由代碼或用戶觸發的。 – alex

相關問題