2013-04-04 14 views
6

Mam etykietę, którą pokazuję tylko w oparciu o jedną z moich właściwości ViewModel. Oto XAML:Tworzenie etykiety WPF (lub innego elementu) za pomocą animacji

<Label HorizontalAlignment="Center" VerticalAlignment="Center" 
     HorizontalContentAlignment="Center" 
     VerticalContentAlignment="Center" 
     FontSize="24" Width="200" Height="200" > 
    <Label.Content > 
     Option in the money! 
    </Label.Content> 
    <Label.Style> 
     <Style TargetType="{x:Type Label}"> 
      <Setter Property="Visibility" Value="Hidden" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding OptionInMoney}" Value="True"> 
        <Setter Property="Visibility" 
       Value="Visible" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Label.Style> 

</Label> 

nie jestem pewien, że to jest najlepszy sposób, ale w każdym razie, ja też chcę mieć etykieta migać. Oczywiście, chcę tylko, aby migał, gdy jest widoczny. Czy ktoś może wskazać mi przykładowy kod lub napisać na to szybki przykład? Zakładam, że potrzebuję jakiegoś spustu i animacji. Przypuszczam, że potrzebuję również spustu, gdy etykieta nie jest już widoczna, aby zatrzymać animację?

Dzięki, Dave P.S. Czy istnieje dobra książka lub strona dla wszystkich tych sztuczek WPF? Coś jak "Książka odpowiedzi MFC" dla tych, którzy pamiętają tę książkę.

+0

Hah - system handlu opcjami? :) Czy znasz animacje storyboardów? Możesz uzyskać pożądane zachowanie, animując właściwość Opacity na elemencie - jeśli dostanę szansę, podam przykład. – JerKimball

Odpowiedz

22

Można dodać animację Storyboard do i uruchomić ją w sekcji EnterActions z DataTrigger.

Prosty DoubleAnimation na Opacity powinny działać prawidłowo

coś takiego:

<Label.Style> 
    <Style TargetType="{x:Type Label}"> 
     <Style.Resources> 
      <Storyboard x:Key="flashAnimation" > 
       <DoubleAnimation Storyboard.TargetProperty="Opacity" From="1" To="0" AutoReverse="True" Duration="0:0:0.5" RepeatBehavior="Forever" /> 
      </Storyboard> 
     </Style.Resources> 

     <Setter Property="Visibility" Value="Hidden" /> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding OptionInMoney}" Value="True"> 
       <Setter Property="Visibility" Value="Visible" /> 
       <DataTrigger.EnterActions> 
        <BeginStoryboard Name="flash" Storyboard="{StaticResource flashAnimation}" /> 
       </DataTrigger.EnterActions> 
       <DataTrigger.ExitActions> 
        <StopStoryboard BeginStoryboardName="flash"/> 
       </DataTrigger.ExitActions> 
      </DataTrigger> 

     </Style.Triggers> 
    </Style> 
</Label.Style> 
+0

Fantastyczne! Czy muszę ustawić, aby zatrzymać animację, gdy właściwość (OptionInMoney) wraca do false, lub nastąpi to automatycznie. To znaczy. potrzebuję DataTrigger.ExitActions i jeśli tak, jak mogę to ustawić? Wspominam o tym, ponieważ widziałem pewną dyskusję w innych postach animacji trwających wiecznie, chociaż nie jest to widoczne. Dzięki jeszcze raz. – Dave

+0

tak, to prawdopodobnie dobry pomysł, aby zatrzymać animację w 'ExitActions', zaktualizowałem odpowiedź z' StopStoryboard' –

+0

Perfect. Dzięki jeszcze raz. – Dave

0

Wypróbuj this post. Nazywa się "Blinking TextBlock", ale można łatwo zamienić TextBox dla etykiety ".

+0

Unikaj odpowiedzi typu "tylko link". Są podatni na zgniliznę ogniową. – ANeves

2

StoryBoard jest z pewnością sposób WPF, ale może to być osiągnięte za pomocą prostego kodu również. Tutaj to idzie, aby mgnieniu etykieta tła:

lblTimer jest Lebel na formularzu z jakimś tekstem, powiedzmy: „Jestem MIGA”

ten może być stosowany do jakiejkolwiek własności, jak widoczność.

// Create a timer. 
private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    DispatcherTimer timer = new DispatcherTimer(); 
    timer.Tick += timer_Tick; 
    timer.Interval = new TimeSpan(0, 0, 0, 0, 500); 
    timer.Start(); 
} 

// The timer's Tick event. 
private bool BlinkOn = false; 
private void timer_Tick(object sender, EventArgs e) 
{ 
    if (BlinkOn) 
    { 
     lblTimer.Foreground = Brushes.Black; 
     lblTimer.Background = Brushes.White; 
    } 
    else 
    { 
     lblTimer.Foreground = Brushes.White; 
     lblTimer.Background = Brushes.Black; 
    } 
    BlinkOn = !BlinkOn; 
} 
+0

Dobrze działa, używam nieprzezroczystości, aby migotać z widocznością. Zwinięty, gdy użycie jest używane, aby odrzucić element (y) migotania +1 – BENN1TH

Powiązane problemy