2016-04-03 3 views
0

Ich habe einen Rahmen. Ich schalte Seiten mit dieser Zeile:WPF: Wie wurde ein Routingereignis für den Inhalt erstellt?

FrameName.Content = new PageName(); 

ich ein Storyboard beginnen soll, wenn die Seite geändert hat, und ich möchte es in XAML zu tun, und nicht in Code-behind. Ich habe den folgenden Code versucht:

<Frame.Triggers> 
    <EventTrigger RoutedEvent="ContentChanged"> 
     <BeginStoryboard Storyboard="{StaticResource storyboardName}" /> 
    </EventTrigger> 
</Frame.Triggers> 

Nach etwas Suche ich erkannte es keine integrierte in geroutet Ereignis dieser Art. Die erste Antwort here legt nahe, dass

Der dynamische Ansatz ist Ihre eigene Label Steuerung einfach ableiten, die ein ContentChanged Ereignis zur Verfügung stellt.

Ich habe versucht, den Code in dieser Antwort zu implementieren:

using System.Windows; 
using System.Windows.Controls; 

namespace ContentChangedTest 
{ 
    class MyFrame : Frame 
    { 
     public event DependencyPropertyChangedEventHandler ContentChanged; 

     static MyFrame() 
     { 
      ContentProperty.OverrideMetadata(typeof(MyFrame), new FrameworkPropertyMetadata(new PropertyChangedCallback(OnContentChanged))); 
     } 

     private static void OnContentChanged(DependencyObject dp, DependencyPropertyChangedEventArgs e) 
     { 
      MyFrame frame = dp as MyFrame; 

      if (frame.ContentChanged != null) 
      { 
       DependencyPropertyChangedEventArgs args = new DependencyPropertyChangedEventArgs(ContentProperty, e.OldValue, e.NewValue); 
       frame.ContentChanged(frame, args); 
      } 
     } 
    } 
} 

In XAML Ich benutze es wie folgt aussehen:

<local:MyFrame ContentChanged="MyFrame_ContentChanged" /> 

Das Problem ist, dass schließlich muss ich eine erstellen Event-Handler MyFrame_ContentChanged im Code-Behind. Gibt es eine Möglichkeit, dies in reinem XAML zu tun? Zum Beispiel - kann ich die ContentChanged Abhängigkeitseigenschaft in irgendeine Art von Routingereignis umwandeln?

+0

Ich bin sehr neu in WPF, also ist es mehr als wahrscheinlich, dass dies eine dumme Frage ist. Ich wäre jedoch dankbar für eine ernsthafte Antwort. – Sipo

+1

Um es in 'EventTrigger' zu verwenden, müssen Sie ein' RoutedEvent' verwenden. Routingereignisse werden ähnlich wie Abhängigkeitseigenschaften definiert. Ein guter Ausgangspunkt für Sie wäre dieses Tutorial: [Vorgehensweise: Erstellen eines benutzerdefinierten Routingereignisses] (https://msdn.microsoft.com/en-us/library/ms752288 (v = vs. 100) .aspx). – Grx70

+0

@ Grx70, \t Danke. Könnten Sie bitte demonstrieren, wie es funktioniert und wie kann ich das mit dem obigen Code integrieren? – Sipo

Antwort

1

Um Ereignisse mit EventTriggers zu verwenden, sollten sie Routing-Ereignisse sein. Routingereignisse werden ähnlich wie Abhängigkeitseigenschaften definiert. Hier ist eine kurze Anleitung, wie Sie loslegen können: How to: Create a Custom Routed Event.

Hier ist ein Beispiel einer Klasse Ableiten von ContentControl, die ein ContentChanged Ereignis definiert:

public class MyContentControl : ContentControl 
{ 
    public static readonly RoutedEvent ContentChangedEvent 
     = EventManager.RegisterRoutedEvent(
      "ContentChanged", 
      RoutingStrategy.Bubble, 
      typeof(RoutedEventHandler), 
      typeof(MyContentControl)); 

    public event RoutedEventHandler ContentChanged 
    { 
     add { AddHandler(ContentChangedEvent, value); } 
     remove { RemoveHandler(ContentChangedEvent, value); } 
    } 

    protected override void OnContentChanged(object oldContent, object newContent) 
    { 
     base.OnContentChanged(oldContent, newContent); 
     RaiseEvent(new RoutedEventArgs(ContentChangedEvent, this)); 
    } 
} 

Ich bin noch nicht sicher, warum, aber während dieser Linie Prüfung in einem Style gearbeitet, aber warf, während eine Ausnahme verwendet direkt in der Trigger-Kollektion Kontrolle:

<EventTrigger RoutedEvent="ContentChanged">...</EventTrigger> 

um es in dieser Situation zu machen arbeitet ich einen vollqualifizierten Ereignis Pfad angeben musste:

<EventTrigger RoutedEvent="local:MyContentControl.ContentChanged">...</EventTrigger> 
Verwandte Themen