Udostępnij za pośrednictwem


Jak animować w stylu

W tym przykładzie pokazano, jak animować właściwości w stylu. Podczas animowania w stylu tylko element struktury, dla którego zdefiniowany jest styl, może być skierowany bezpośrednio. Aby odwołać się do obiektu zamrażalnego, musisz przejść od właściwości elementu stylizowanego.

W poniższym przykładzie kilka animacji jest zdefiniowanych w stylu i zastosowanych do elementu Button. Gdy użytkownik przenosi wskaźnik myszy nad przycisk, wielokrotnie zmienia się z nieprzezroczystego na częściowo prześwitujący i z powrotem. Gdy użytkownik przesuwa wskaźnik myszy z przycisku, staje się całkowicie nieprzezroczysty. Po kliknięciu przycisku jego kolor tła zmienia się z pomarańczowego na biały i z powrotem. Ponieważ SolidColorBrush używane do malowania przycisku nie można bezpośrednio zastosować, jest on uzyskiwany przez kropkowanie w dół od właściwości Background przycisku.

Przykład

<!-- StyleStoryboardsExample.xaml
     This example shows how to create storyboards in a style. -->
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  WindowTitle="Storyboards in Styles Example" Background="White">
  <Page.Resources>
  
    <!-- Defines a Button style. -->
    <Style TargetType="{x:Type Button}" x:Key="MyButtonStyle">
      <Setter Property="Button.Background">
        <Setter.Value>
          <SolidColorBrush Color="Orange" />
        </Setter.Value>
      </Setter>
      <Style.Triggers>
      
        <!-- Animates the button's opacity on mouse over. -->
        <EventTrigger RoutedEvent="Button.MouseEnter">
          <EventTrigger.Actions>
            <BeginStoryboard>
              <Storyboard>
                <DoubleAnimation
                  Storyboard.TargetProperty="(Button.Opacity)"
                  From="1.0" To="0.5" Duration="0:0:0.5" AutoReverse="True"
                  RepeatBehavior="Forever" />
              </Storyboard>
            </BeginStoryboard>
          </EventTrigger.Actions>
        </EventTrigger>  
        
        <!-- Returns the button's opacity to 1 when the mouse leaves. -->
        <EventTrigger RoutedEvent="Button.MouseLeave">
          <EventTrigger.Actions>
            <BeginStoryboard>
              <Storyboard>
                <DoubleAnimation
                  Storyboard.TargetProperty="(Button.Opacity)"
                  To="1" Duration="0:0:0.1" />
              </Storyboard>
            </BeginStoryboard>
          </EventTrigger.Actions>
        </EventTrigger>   
        
        <!-- Changes the button's color when clicked. 
             Notice that the animation can't target the
             SolidColorBrush used to paint the button's background
             directly. The brush must be accessed through the button's
             Background property. -->
        <EventTrigger RoutedEvent="Button.Click">
          <EventTrigger.Actions>
            <BeginStoryboard>
              <Storyboard>
                <ColorAnimation 
                  Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
                  From="Orange" To="White" Duration="0:0:0.1" AutoReverse="True" />
              </Storyboard>
            </BeginStoryboard>
          </EventTrigger.Actions>
        </EventTrigger>  
      </Style.Triggers>
    </Style>
  </Page.Resources>
  
  <StackPanel Margin="20">
    <Button Style="{StaticResource MyButtonStyle}">Click Me</Button>
  </StackPanel>
</Page>

Należy pamiętać, że w przypadku animowania w stylu można celować w obiekty, które nie istnieją. Załóżmy na przykład, że styl używa SolidColorBrush do ustawiania właściwości tła przycisku, ale w pewnym momencie styl jest zastępowany, a tło przycisku jest ustawiane na LinearGradientBrush. Próba animowania SolidColorBrush nie wygeneruje wyjątku; animacja po prostu nie powiedzie się bez powiadomienia.

Aby uzyskać więcej informacji na temat składni docelowej scenorysów, zobacz Storyboards Overview. Aby uzyskać więcej informacji na temat animacji, zobacz Omówienie animacji. Aby uzyskać więcej informacji na temat stylów, zobacz Style and Templating.