2017-07-13 2 views
-1

nehme an, dass ich diese Funktion Erklärung haben:überprüfen, ob ein Ereignis durch einen Benutzerklick ausgelöst wird?

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

kann diese Funktion von einem Benutzer klicken und in meinem Code von anderen Funktionen ausgelöst werden. Ich möchte überprüfen, wenn diese Funktion von einem Benutzer ausgelöst wird, klicken Sie auf, wie?

+0

Sie meinen, wie sie dem Benutzer gegen die ‚Spacebar‘ drücken? Oder von anderem Code innerhalb Ihrer Klasse? –

+1

Worauf zielen Sie ab: Winforms, WPF, ASP ..? __Always__ tag Ihre Frage richtig! – TaW

+0

Warum müssen Sie wissen; Wie wird sich das ändern, was du tun wirst? – Servy

Antwort

0

Eine Methode kann nicht sagen, wer sie aufgerufen hat. Aber hier haben Sie ein sender Argument. Wenn die Methode von einem Benutzer aufgerufen wird klicken, wird der Absender die ToggleButton der Benutzer geklickt. Wenn Sie diese Methode im Code aufrufen, übergeben Sie etwas anderes. Z.B. das Objekt, das den Anruf macht:

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

In ToggleButton_Checked:

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

Hinweis: Wenn Sie ToggleButton_Checked anrufen, Sie sind alle Ereignisse nicht abfeuern, sind Sie nur einen Event-Handler aufrufen.


Ich denke, das Problem, das Sie haben könnten (man kann es nicht erklären haben) ist, dass Sie die Checked Eigentum Ihrer Kontrolle ändern sich, aber nicht wollen, dass der Event-Handler in diesem Fall ausgelöst werden.

Sie können dies erreichen, indem er eine Wache mit

private bool _changing; // Field 

-Code die Änderung tun:

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

im Ereignishandler ToggleButton_Checked, anbei erhalten Sie Ihren Code mit

if (!_changing) { 
    // Your code handler stuff. 
} 
+0

Aber die Frage fragt nicht nach dem Fall, wo die Methode als Ergebnis des Benutzercodes aufgerufen wird, fragen sie nach dem Fall wobei das Ereignis aufgrund des Benutzercodes ausgelöst wird, was bedeutet, dass der Absender weiterhin die Schaltfläche ist.Beachten Sie, dass wenn das OP * * die Methode aufrufen würde, anstatt das Ereignis auszulösen, dann wäre die Lösung eine andere Methode zu haben, die einen Parameter verwendet, der angibt, was es anders machen soll (anstatt ein "Objekt", dessen Laufzeittyp ist) geprüft werden) als eine Möglichkeit, dies zu erreichen. – Servy

+0

Kann ein Ereignis einer anderen Klasse ausgelöst werden? Ich denke nicht, dass es möglich ist, ein Ereignis des "TogleButton" von außen zu feuern. Sie können die Eigenschaft "Checked" von außerhalb festlegen. –

+0

Nicht explizit. Sie können eine Aktion ausführen, die dazu führt, dass diese Klasse das Ereignis auslöst (indem sie es im Falle eines "Checked" -Ereignisses überprüft). – Servy

1

Sie können nehmen Sie Ihre Frage ganz weg, indem Sie einfach keine Ereignisse von aufrufen Benutzercode.

Ereignishandler existieren, um ... Ereignisse zu verarbeiten. So extrahieren Sie die Logik aus dem Ereignis in seine eigene Methode:

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

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

Und dann können Sie die gleiche Methode von Code aufrufen:

DoTheThing(userInitiated: false); 
Verwandte Themen