Befestigt Verhalten Handhabung eines Angefügten Ereignisses in WPF
Habe ich gegoogelt bezüglich dieser Frage, aber konnte nicht sammeln alle Informationen, und ich Frage mich, ob es möglich ist für ein angeschlossenes Verhalten zum behandeln eines angefügten Ereignisses??
Habe ich ein Ereignis in einer Klasse deklariert und ein Verhalten, dass ich mich Anhängen an ein TextBox-Steuerelement, das Ereignis wird ausgelöst, wenn eine Schaltfläche geklickt wird. Ich fügte hinzu, die Prozedur für dieses Ereignis in meinem Verhalten und schrieb die Logik der event-handler, aber es wird nicht ausgeführt. Also, ich Frage mich, ob es möglich ist für ein angeschlossenes Verhalten zum behandeln eines angefügten Ereignisses oder nicht?
class ResetInputEventClass
{
public static readonly RoutedEvent ResetInputEvent = EventManager.RegisterRoutedEvent("ResetInput",
RoutingStrategy.Bubble,
typeof(RoutedEventHandler),
typeof(ResetInputEventClass));
public static void AddResetInputEventHandler(DependencyObject d, RoutedEventHandler handler)
{
UIElement uie = d as UIElement;
if (uie == null)
{
return;
}
uie.AddHandler(ResetInputEventClass.ResetInputEvent, handler);
}
public static void RemoveResetInputEventHandler(DependencyObject d, RoutedEventHandler handler)
{
UIElement uie = d as UIElement;
if (uie == null)
{
return;
}
uie.RemoveHandler(ResetInputEventClass.ResetInputEvent, handler);
}
}
Das ist meine Event-Klasse und dies ist, wie ich es im Umgang mit dem Verhalten
public class MyBehavior : Behavior<TextBoxBase>
{
public MyBehavior()
{
//Insert code required on object creation below this point.
}
protected override void OnAttached()
{
base.OnAttached();
//Insert code that you would want run when the Behavior is attached to an object.
ResetInputEventClass.AddResetInputEventHandler(AssociatedObject, OnResetInputEvent);
}
protected override void OnDetaching()
{
base.OnDetaching();
//Insert code that you would want run when the Behavior is removed from an object.
ResetInputEventClass.RemoveResetInputEventHandler(AssociatedObject, OnResetInputEvent);
}
private void OnResetInputEvent(Object o, RoutedEventArgs e)
{
//Logic
}
}
Hier ist mein XAML Code:
<Grid x:Name="LayoutRoot">
<StackPanel>
<TextBox Margin="5" Text="Bye" TextWrapping="Wrap" Width="150">
<i:Interaction.Behaviors>
<local:MyBehavior/>
</i:Interaction.Behaviors>
</TextBox>
<TextBox Margin="5" Text="Bye" TextWrapping="Wrap" Width="150">
<i:Interaction.Behaviors>
<local:MyBehavior/>
</i:Interaction.Behaviors>
</TextBox>
<Button Name="MyButton" Content="Save" Width="50" Height="25" Click="MyButton_Click"/>
</StackPanel>
</Grid>
und ich bin auslösen des Ereignisses in das click-Ereignis der Taste meine
private void MyButton_Click(object sender, RoutedEventArgs e)
{
RoutedEventArgs eventArgs = new RoutedEventArgs(ResetInputEventClass.ResetInputEvent,e.OriginalSource);
RaiseEvent(eventArgs);
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es natürlich möglich ist. Zeigen Sie mir Ihre XAML und ich ll Telefon Sie, wie eine angefügte Ereignis löst einen angeschlossenen Verhalten.
Bearbeitet:
Ich sehe nicht die Notwendigkeit, warum Sie mit angehängten Verhalten und die angefügte Ereignisse, weil Sie alles tun konnte, was im code dahinter.
Hier ist, wie zu tun alles, was in der code behind:
Hier ist der XAML-ohne angefügte Eigenschaften:
Dies ist der code dahinter.
Weil Sie haben, legen Sie den Namen-Eigenschaft auf
TextBox
undButton
Sie zugreifen können Sie code hinter Ihrem Fenster.cs und Sie können schreiben Sie Ihre handler easly.Hier ist, wie können Sie alles das mit angefügte Eigenschaften:
Dies ist die neue XAML-Code für die Lösung mit attached properties. Ich hatte meine benutzerdefinierte Interaktion, weil die, die Sie mit Expression Blend oder silverlight und nicht Reine WPF.
Ich musste Verhalten auf
True
weil der default-Wert istfalse
und wenn der Wert nicht gleich dem alten, dann das Anwesen verändert Ereignis wird aufgerufen mit meine eigene Logik wie diese:Innerhalb Eigentum changed-Ereignis aufgerufen wird, wie ich bereits erwähnt, wenn ich das ändern
false
zutrue
. Ich warte, bis alles intialized, indem er dem dispatcher zur Ausführung meines Codes, wenn die Anwendung im hintergrund läuft. Dann finde ich dieTextBox
und injizieren der handler wird aufgerufen, wenn Sie ausgelöstResetInput
Veranstaltung.Dies ist eine sehr komplizierte Lösung, aber es funktioniert mit angeschlossenen Veranstaltungen und angefügte Eigenschaften.
Ich empfehle Ihnen, verwenden Sie die code-behind für dieses Szenario.
Auch Sie einen Fehler gemacht haben in Ihrem
ResetInputEventClass
Klasse. Add-und Remove-Methoden sind nicht richtig geschrieben.Dies ist, wie sollten Sie Sie geschrieben haben:
Spaß haben, ich hoffe, dass ich Ihnen geholfen.
Könnte man auch dies erreicht haben, mit
Commands
Dein problem ist einfach. Die textbox ist registriert für das event, aber das übergeordnete Element ist das Textfeld zu heben. So wird der handler nicht aufgerufen. Sie können ändern, die Veranstaltung zu machen, eine Tunneling-Ereignis anstelle von Sprudelnder. Oder können Sie sich einen Griff auf Ihrem Textfeld (geben Sie einen Namen und Verweise im code behind). Und haben Sie das Ereignis auslösen.
Ihre code-behind-sollte dann so Aussehen
... und dass sollte dein problem lösen.