2009-06-26 8 views
4

Dans un document XAML, j'ai un dégradé en tant que ressource et un tas de formes qui utilisent cette ressource. Je voudrais animer le pinceau en utilisant un storyboard, mais je ne sais pas comment mettre le pinceau dans les ressources comme cible du storyboard. Le simple fait d'utiliser son nom ne fonctionne pas, le nom {StaticResource name} ne fonctionne pas non plus. Est-ce même possible?Comment animer une ressource en XAML?

Je préférerais une solution XAML seulement, mais si cela ne fonctionne pas, je vais utiliser le code-behind. Si cela me permet de quitter Storyboard.Target et Storyboard.TargetProperty non affecté.

EDIT: Je voudrais animer un arrêt en dégradé de la brosse. La chose est que je peux l'animer facilement quand ce n'est pas une ressource, mais qu'elle est appliquée directement sur un objet. Je peux le faire en cliquant sur Expression Blend. Je ne sais pas comment animer quand sa ressource (à savoir ce qu'il faut mettre à la place du ?? dans le code ci-dessous (le story-board a été créé pour un rectangle))

code: 
<UserControl.Resources> 
    <LinearGradientBrush x:Key="Outline" EndPoint="0.5,1" StartPoint="0.5,0"> 
     <GradientStop Color="#7F7CE3FF" Offset="0"/> 
     <GradientStop Color="#7F047695" Offset="1"/> 
     <GradientStop Color="#FFFFFFFF" Offset="0.942"/> 
    </LinearGradientBrush> 
    <Storyboard x:Key="Glitter"> 
     <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="??" Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[0].(GradientStop.Offset)"> 
      <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/> 
      <SplineDoubleKeyFrame KeyTime="00:00:02.6000000" Value="0.529"/> 
     </DoubleAnimationUsingKeyFrames> 

    </Storyboard> 
... 

Répondre

2

Vous ne pouvez pas animer les propriétés le type Pinceau, vous pouvez seulement animer des types qui ont une classe d'animation appropriée, par exemple DoubleAnimation, PointAnimation ou ColorAnimation (notez que le dernier anime les propriétés du type Couleur, pas Pinceau).

Cependant, certains styles possèdent DependencyProperties du type double, que vous pouvez animer, par exemple les propriétés StartPoint et EndPoint de la classe LinearGradientBrush.

Si vous pouvez élaborer sur ce que l'animation devrait faire exactement, peut-être que nous pourrions trouver une solution de contournement.

Editer: Pour animer le pinceau, il doit être déclaré dans le champ d'application de votre animation-déclencheur, par ex. dans le Data- ou ControlTemplate. L'animation d'une ressource via sa clé ne fonctionnera pas.

0

Vous ne savez pas exactement ce que vous essayez d'animer à l'intérieur du pinceau, mais l'animation des ressources du pinceau peut être très délicate. Je n'ai pas le temps de taper tout, mais voici un petit « tutoriel » sur la façon de le gérer:

Animating Brushes with ObjectAnimationUsingKeyFrames

3

Il fonctionne lorsque vous animez l'arrière-plan/Remplir directement la propriété, en utilisant le nom du objet (par exemple Rectangle) que vous souhaitez animer comme Storyboard.TargetName:

<Window x:Class="WpfApplication1.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="300"> 
<Grid> 
    <Grid.Resources> 
     <LinearGradientBrush x:Key="Outline" EndPoint="0.5,1" StartPoint="0.5,0"> 
      <GradientStop Color="#7F7CE3FF" Offset="0"/> 
      <GradientStop Color="#7F047695" Offset="1"/> 
      <GradientStop Color="#FFFFFFFF" Offset="0.942"/> 
     </LinearGradientBrush> 
    </Grid.Resources> 

    <Border Name="border" 
      Background="{StaticResource Outline}" 
      Width="200" Height="200" /> 
</Grid> 

<Window.Triggers> 
    <EventTrigger RoutedEvent="Window.Loaded"> 
     <BeginStoryboard> 
      <Storyboard> 
       <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" 
               Storyboard.TargetName="border" 
               Storyboard.TargetProperty="(Border.Background).(GradientBrush.GradientStops)[0].(GradientStop.Offset)"> 
        <SplineDoubleKeyFrame KeyTime="00:00:0" Value="0"/> 
        <SplineDoubleKeyFrame KeyTime="00:00:1" Value="1"/> 
       </DoubleAnimationUsingKeyFrames> 
      </Storyboard> 
     </BeginStoryboard> 
    </EventTrigger> 
</Window.Triggers> 

Modifier

De code derrière, il semble être tout à fait possible:

XAML:

<Grid Name="grid"> 
    <Grid.Resources> 
     <LinearGradientBrush x:Key="Outline" EndPoint="0.5,1" StartPoint="0.5,0"> 
      <GradientStop Color="#7F7CE3FF" Offset="0"/> 
      <GradientStop Color="#7F047695" Offset="1"/> 
      <GradientStop Color="#FFFFFFFF" Offset="0.942"/> 
     </LinearGradientBrush> 
    </Grid.Resources> 

    <Border Background="{StaticResource Outline}" 
      Width="100" Height="100" HorizontalAlignment="Left" /> 

    <Border Background="{StaticResource Outline}" 
      Width="100" Height="100" HorizontalAlignment="Right" /> 
</Grid> 

code C# derrière:

 LinearGradientBrush b = grid.Resources["Outline"] as LinearGradientBrush; 

     b.GradientStops[0].BeginAnimation(GradientStop.OffsetProperty, new DoubleAnimation(0, 1, new Duration(TimeSpan.FromSeconds(1)))); 
+0

Eh oui, cela fonctionne, mais j'ai plusieurs formes à l'aide de ce pinceau, de sorte Je pensais pouvoir tout faire à la fois. –

+0

Comme je l'ai dit, je ne pense pas qu'il soit possible d'animer des objets qui sont stockés dans les ressources. – Andrej

+0

J'ai ajouté un autre échantillon, où j'anime la brosse via code-behind. Cela semble ne pas poser de problème du tout. – Andrej

Questions connexes