2009-06-26 87 views
4

在一個XAML文檔中,我使用漸變畫筆作爲資源和一堆使用此資源的形狀。我想用故事板動畫化畫筆,但我不知道如何將資源中的畫筆設置爲故事板的目標。簡單地使用它的名字不起作用,{StaticResource name}也不起作用。它甚至有可能嗎?如何在XAML中動畫資源?

我寧願只使用XAML解決方案,但如果不能解決問題,我會使用代碼隱藏功能。如果它允許我離開Storyboard.Target並且Storyboard.TargetProperty未指定。

編輯:我想動畫刷的漸變停止。問題是,當它不是資源時,我可以很容易地進行動畫處理,但直接應用於對象。我可以通過點擊Expression Blend來實現。我只是不知道如何製作動畫時,其資源

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> 
... 

回答

2

你不能動畫的屬性(也就是將代替在下面的代碼?什麼(故事板是一個矩形)創建)類型刷子,您只能動畫具有適當動畫類的類型,例如DoubleAnimation,PointAnimation或ColorAnimation(注意最後一個動畫類型爲Color的屬性,而不是Brush)。

但是,某些畫筆具有Double類型的DependencyProperties,您可以設置動畫效果,例如LinearGradientBrush類的StartPoint和EndPoint屬性。

如果您可以詳細說明動畫應該做什麼,也許我們可以找到解決方法。

編輯: 要爲Brush創建動畫,它必須在Animation-Trigger的範圍內聲明,例如,在Data-或ControlTemplate中。通過密鑰動畫資源不起作用。

3

它時,你的動畫背景的作品/直接填寫屬性,使用的名稱對象(例如矩形)要動畫爲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> 

編輯

從後面的代碼似乎是完全可能的:

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> 

C#代碼隱藏:

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

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

是的,這工作,但我有使用刷子多個形狀,所以我以爲我可以一次做到這一切。 – 2009-06-26 14:09:46