Frage

Ich habe eine benutzerdefinierte Klasse mit dem Namen BlinkingLight. Ich habe auch eine statische ObservableCollection BlinkingLightCollection. In der Benutzeroberfläche habe ich eine List-Box, die auf BlinkingLightCollection gebunden ist.

In meinem ListBox Ich mag als eine benutzerdefinierte Steuerung jedes BlinkingLight Objekt im Wesentlichen anzuzeigen, die mit einem LED-Licht wie Box aussieht, die eine Animation hat, dass die LED macht es aussieht nur für eine Sekunde blitzte auf, dann geht wieder normal.

Meine BlinkingLight Klasse hat third party "LED" Objekt, das ein Ereignis namens 'Flash' erhöht.

ich für Ideen oder Lösungen suchen diese Arbeit zu bekommen!

Mein gescheiterter Versuch:

Ich habe ein benutzerdefiniertes Steuerelement (BlinkingLightControl), die auf die Daten meiner BlinkingLight Klasse binden kann, wenn ein BlinkingLight die Datacontext von meiner benutzerdefinierten Kontrolle ist.

Ich habe ein Datatemplate für meine List-Box:

<Window.Resources>
  <DataTemplate x:Key="blinkingLightItemTemplate" >
    <local:BlinkingLightControl />
  </DataTemplate>
</Window.Resources>

<ListBox ItemsSource={Binding Source={x:Static local:Data.BlinkingLightCollection}}
         ItemTemplate="{StaticResource blinkingLightItemTemplate}" />

. Hinweis: Ich kann nur die XAML für meine individuelle Kontrolle gestellt in die Datatemplate eine völlig andere Kontrolle zu haben, wenn die Dinge einfacher macht

Jetzt möchte ich einen Eventtrigger in meinem BlinkingLightControl haben (oder Datatemplate), wer RoutedEvent das Ereignis LED.Flash ist. Leider scheinen ich kann nicht diesen Teil herauszufinden. Ich habe versucht, eine RoutedEvent in meiner BlinkingLight Klasse zu erstellen und es nur zu erhöhen, wenn ich das LED.Flash Ereignis zu behandeln. Jedoch meine Klasse ist kein UIElement oder Content und pro MSDN: MSND Link-

.

"Die Routingereignis Inhaber jeder Klasse sein kann, aber geroutet Ereignisse nach und nach UIElement oder Contentelement abgeleiteten Klassen, um nützlich zu sein behandelt werden angehoben müssen Weitere Informationen über benutzerdefinierte Ereignisse finden Sie unter Gewusst wie: Erstellen einer benutzerdefinierten Routingereignis ".

Jede Hilfe wäre sehr dankbar !! Vielen Dank, Scott

War es hilfreich?

Lösung 2

Ich konnte mit einer Lösung kommen, die sehr gut funktioniert hat:

Da meine Datatemplate einfach eine benutzerdefinierte Usercontrol enthalten (die die Datacontext bindet an seine Daten aus dem Business-Objekt zu bekommen) ... Ich legte meine benutzerdefinierte RoutedEvent in dem Usercontrol. Da ist in meinem Usercontrol geladen Ereignisse, warf ich die Datacontext als mein Business-Objekt Zugriff auf das Business-Objekt Eigentum zu erhalten, die das Ereignis hat und es Haken bis zu einem Event-Handler. (In meinem Beispiel warf ich die Datacontext als BlinkingLight Objekt, dann kann ich den Zugriff auf seine LED-Eigenschaft Flash-Ereignis und einhaken, um einen benutzerdefinierten Ereignishandler nach oben). . Hinweis: Das LED-Objekt muss eine Eigenschaft, nicht nur ein Feld in dem BlinkingLight Objekt für sie arbeiten

Dann kann der Event-Handler die Usercontrol individuelle Routingereignis (FlashGreenEvent) erhöhen. Unten ist die Rückseite Code Ende, das jetzt den Code in das OP ergänzt (ich habe andere irrelevant Code gezupft).

public partial class BlinkingLightControl : UserControl
{
    public static readonly RoutedEvent FlashGreenEvent = EventManager.RegisterRoutedEvent("FlashGreen", RoutingStrategy.Direct, typeof(RoutedEventHandler), typeof(BlinkingLightControl));
    public event RoutedEventHandler FlashGreen
    {
        add { AddHandler(FlashGreenEvent, value); }
        remove { RemoveHandler(FlashGreenEvent, value); }
    }

    private void BlinkingLightControl_Loaded(object sender, RoutedEventArgs e)
    {
        BlinkingLight blinkingLight = (BlinkingLight)this.DataContext;

        blinkingLight.Led.Flash += LED_Flash;
    }

    protected delegate void LED_FlashCallback(ThirdParty.LED sender);
    public void LED_Flash(ThirdParty.LED sender)
    {
        if (this.Dispatcher.CheckAccess())
        {
            // Raise the Flash Green Event;
            RaiseEvent(new RoutedEventArgs(BlinkingLightControl.FlashGreenEvent));
        }
        else
            this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new LED_FlashCallback(LED_Flash), sender);
    }
}

Andere Tipps

In diesem Fall ist der beste Weg ist, WPF kommandier zu verwenden und eine „BlinkTheLights“ RoutedCommand erstellen - Ihr BlinkingLightControl den BlinkTheLights Befehl verarbeiten und reagieren, indem sie ein Storyboard beginnen, die das Licht blinken tut.

Wenn Sie eine benutzerdefinierte Steuerung machen du immer den Auslöser außerhalb der Steuervorlage einstellen könntest.

so etwas wie:

  <Style TargetType="{x:Type local:MyControl}">

  <!-- fade in the control with an animation -->
  <Style.Triggers>
    <EventTrigger RoutedEvent="Control.Loaded">
      <BeginStoryboard>
        <Storyboard>
         <DoubleAnimation To="1" Duration="0:0:1" Storyboard.TargetProperty="Opacity"/>
        </Storyboard>
      </BeginStoryboard>
    </EventTrigger>
  </Style.Triggers>

  <!-- Make sure the opacity starts at 0 -->
  <Setter Property="Opacity" Value="0"/>
  <Setter Property="Template">
      <Setter.Value>
         <ControlTemplate TargetType="{x:Type local:MyControl}">
         </ControlTemplate>
      </Setter.Value>
  </Setter>
</Style>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top