2017-12-14 7 views
2

gezeigt Ich versuche, den Inhalt eines Etiketts zu tun, um zu animieren:C# WPF Animated Label Inhalt wird nicht

Loading 
Loading. 
Loading.. 
Loading... 

wieder: wie in dieser example

Loading 
Loading. 
Loading.. 
Loading... 

und so weiter .

Unter dem Code:

<Label Grid.Row="2" x:Name="CurrentTask" 
     FontFamily="Microsoft Sans Serif" FontSize="18" FontStyle="Italic" FontWeight="Bold" 
     Foreground="White" Content="Loading"> 
    <Label.Template> 
     <ControlTemplate> 
      <ControlTemplate.Triggers> 
       <Trigger Property="IsEnabled" Value="False"> 
        <Trigger.EnterActions> 
         <BeginStoryboard> 
          <Storyboard> 
           <ObjectAnimationUsingKeyFrames Storyboard.TargetName="PART_Content" Storyboard.TargetProperty="Content" Duration="00:00:00.8" RepeatBehavior="Forever"> 
            <DiscreteObjectKeyFrame KeyTime="00:00:00.0" Value="Loading"/> 
            <DiscreteObjectKeyFrame KeyTime="00:00:00.2" Value="Loading."/> 
            <DiscreteObjectKeyFrame KeyTime="00:00:00.4" Value="Loading.."/> 
            <DiscreteObjectKeyFrame KeyTime="00:00:00.6" Value="Loading..."/> 
           </ObjectAnimationUsingKeyFrames> 
          </Storyboard> 
         </BeginStoryboard> 
        </Trigger.EnterActions> 
       </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </Label.Template> 
</Label> 

Das Problem ist, dass Etikett Inhalt nicht sichtbar in dem WPF-Fenster ist. Es wird nicht angezeigt. Was mache ich falsch?

Auch in den Zeilen vom Typ:

<DiscreteObjectKeyFrame KeyTime="00:00:00.0" Value="Loading"/> 

Statt Hartcodierung den Wert Ich mag würde das Etikett Inhalt auf die Punkte verketten, wie kann ich das tun? Ich möchte nicht die Zeichenfolge "Loading" in jedem DiscreteObjectKeyFrame wiederholen.

UPDATE:

<Label Grid.Row="2" x:Name="CurrentTask" 
      FontFamily="Microsoft Sans Serif" FontSize="18" FontStyle="Italic" 
      Foreground="White" Content="Loading"> 
     <Label.Style> 
      <Style TargetType="Label"> 
       <Style.Triggers> 
        <EventTrigger RoutedEvent="Label.Loaded"> 
         <EventTrigger.Actions> 
          <BeginStoryboard> 
           <Storyboard> 
            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Content" Duration="00:00:00.8" RepeatBehavior="Forever"> 
             <DiscreteObjectKeyFrame KeyTime="00:00:00.0" Value="Loading"/> 
             <DiscreteObjectKeyFrame KeyTime="00:00:00.2" Value="Loading."/> 
             <DiscreteObjectKeyFrame KeyTime="00:00:00.4" Value="Loading.."/> 
             <DiscreteObjectKeyFrame KeyTime="00:00:00.6" Value="Loading..."/> 
            </ObjectAnimationUsingKeyFrames> 
           </Storyboard> 
          </BeginStoryboard> 
         </EventTrigger.Actions> 
        </EventTrigger> 
       </Style.Triggers> 
      </Style> 
     </Label.Style> 
    </Label> 

Antwort

2

Neben den Trigger Ihre Control ist: Statt Erhöhung Trigger auf IsEnabled = True, ich habe zum Beispiel im Fall der Anwendung Aufkleberart label.loaded wie unten verwendet leer, so offensichtlich ist nichts gezeigt.

Sie können einen ContentPresenter hinzufügen und auch den Storyboard.TargetName entfernen. Es sieht auch seltsam aus, dass Ihr Trigger auf IsEnabled auf false gesetzt ist.

<Label.Template> 
    <ControlTemplate TargetType="Label"> 

     <ContentPresenter/> 

     <ControlTemplate.Triggers> 
      <Trigger Property="IsEnabled" Value="True"> 
       <Trigger.EnterActions> 
        <BeginStoryboard> 
         <Storyboard> 
          <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Content" Duration="00:00:00.8" RepeatBehavior="Forever"> 
           <DiscreteObjectKeyFrame KeyTime="00:00:00.0" Value="Loading"/> 
           <DiscreteObjectKeyFrame KeyTime="00:00:00.2" Value="Loading."/> 
           <DiscreteObjectKeyFrame KeyTime="00:00:00.4" Value="Loading.."/> 
           <DiscreteObjectKeyFrame KeyTime="00:00:00.6" Value="Loading..."/> 
          </ObjectAnimationUsingKeyFrames> 
         </Storyboard> 
        </BeginStoryboard> 
       </Trigger.EnterActions> 
      </Trigger> 
     </ControlTemplate.Triggers> 
    </ControlTemplate> 
</Label.Template> 

jedoch, was Sie vielleicht tatsächlich haben wollen, ist ein Stil-Trigger anstelle einem Control Trigger:

<Label ...> 
    <Label.Style> 
     <Style TargetType="Label"> 
      <Style.Triggers> 
       <Trigger Property="IsEnabled" Value="True"> 
        <Trigger.EnterActions> 
         <BeginStoryboard> 
          <Storyboard> 
           <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Content" Duration="00:00:00.8" RepeatBehavior="Forever"> 
            <DiscreteObjectKeyFrame KeyTime="00:00:00.0" Value="Loading"/> 
            <DiscreteObjectKeyFrame KeyTime="00:00:00.2" Value="Loading."/> 
            <DiscreteObjectKeyFrame KeyTime="00:00:00.4" Value="Loading.."/> 
            <DiscreteObjectKeyFrame KeyTime="00:00:00.6" Value="Loading..."/> 
           </ObjectAnimationUsingKeyFrames> 
          </Storyboard> 
         </BeginStoryboard> 
        </Trigger.EnterActions> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </Label.Style> 
</Label> 

Für den wiederholten „Laden“ Zeichenfolge im Inhalt, nur zwei nutzen Labels, eines mit einer festen "Loading" -Saite, das andere mit den Punkten, und ihre Padding anpassen. Oder besser, zwei TextBlocks:

<StackPanel Orientation="Horizontal"> 
    <TextBlock Text="Loading"/> 
    <TextBlock> 
     <TextBlock.Style> 
      <Style TargetType="TextBlock"> 
       <Style.Triggers> 
        <Trigger Property="IsEnabled" Value="True"> 
         <Trigger.EnterActions> 
          <BeginStoryboard> 
           <Storyboard> 
            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Text" Duration="00:00:00.8" RepeatBehavior="Forever"> 
             <DiscreteObjectKeyFrame KeyTime="00:00:00.0" Value=""/> 
             <DiscreteObjectKeyFrame KeyTime="00:00:00.2" Value="."/> 
             <DiscreteObjectKeyFrame KeyTime="00:00:00.4" Value=".."/> 
             <DiscreteObjectKeyFrame KeyTime="00:00:00.6" Value="..."/> 
            </ObjectAnimationUsingKeyFrames> 
           </Storyboard> 
          </BeginStoryboard> 
         </Trigger.EnterActions> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </TextBlock.Style> 
    </TextBlock> 
</StackPanel> 
+0

Hallo Clemens! Um einen schnellen Test durchzuführen, habe ich die zweite Ihrer Lösungen ausprobiert, indem ich den Label-Style-Trigger gesetzt habe, aber es funktioniert nicht. Etiketteninhalt bleibt immer "Laden". Ich habe eine MVVM-App mit einem Fenster und diesem Label, und dieses Fenster ist ein Begrüßungsbildschirm. Dieser Begrüßungsbildschirm wird (durch Instanziierung des Konstruktors) vom Ansichtskonstruktor aufgerufen. Abschließend wird Show Show() angezeigt. All diese Dinge machen mit einem Thread mit Appartment State auf STA gesetzt ... – user1624552

+0

... In der Zwischenzeit, im View-Konstruktor der Fluss weiter, ich setze Datenkontext mit dem ViewModel und dann eine Datenbankanforderung in der Ansicht durchgeführt wird Modellbauer. Wenn dies abgeschlossen ist, wird der Begrüßungsbildschirm geschlossen. Vielleicht liegt es an dem Thread, dass es nicht funktioniert? – user1624552

+0

Wie gesagt, es sieht seltsam aus, dass Ihr Trigger auf IsEnabled auf false gesetzt ist. Ist das beabsichtigt? – Clemens