2016-06-09 13 views
0

我在我的WPF應用程序中多次使用情節提要動畫,並且我更願意創建一種我可以編輯的樣式而不是多個條目。但是,我需要每次都傳入一個對兩個特定的StackPanel的引用。是否只有XAML解決方案,還是僅使用代碼背後的唯一方法?創建接受變量的情節提要模板

有問題的變量將是下面引用的datePicker和classPicker StackPanels。

<BeginStoryboard> 
    <Storyboard> 
    <DoubleAnimation Storyboard.TargetProperty="Opacity" 
        Storyboard.TargetName="classPicker" 
        From="1.0" To="0" Duration="0:0:0.25" 
        BeginTime="0:0:0"/> 
    <DoubleAnimation Storyboard.TargetProperty="Opacity" 
        Storyboard.TargetName="datePicker" 
        From="0" To="1.0" Duration="0:0:0.25" 
        BeginTime="0:0:0.25"/> 
    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="classPicker"                      
            Storyboard.TargetProperty="Visibility"> 
     <DiscreteObjectKeyFrame KeyTime="0:0:0.25" 
           Value="{x:Static Visibility.Collapsed}"/> 
    </ObjectAnimationUsingKeyFrames> 
    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="datePicker"                     
            Storyboard.TargetProperty="Visibility"> 
     <DiscreteObjectKeyFrame KeyTime="0:0:0.25" 
           Value="{x:Static Visibility.Visible}"/> 
    </ObjectAnimationUsingKeyFrames> 
    </Storyboard> 
</BeginStoryboard> 
+0

你是說故事板應該從基於第三屬性一組特定的參考文獻中進行選擇,或者你只是想使該數據驅動並通過任何控制參考? – OmegaMan

+0

@OmegaMan我希望能夠重用通過樣式創建的相同動畫,並且每次使用時都能夠傳入兩個不同的TargetName。對不起,如果我的術語關閉,對XAML設計來說很新。 – Ryan

+0

您是否嘗試過創建自定義控件?這樣的工作是在一個位置完成的,並且您的頁面可能會有多個位置,根據需要不會隱藏。 – OmegaMan

回答

0

按照@ OmegaMan的建議,我創建了一個從Button類繼承的自定義控件。使用DependencyProperties,我可以傳遞我希望動畫影響的XAML中的元素。

自定義類:

public partial class ButtonWithAnim : Button 
{ 
    public Grid GridToFadeOut 
    { 
     get { return (Grid)GetValue(GridToFadeOutProperty); } 
     set { SetValue(GridToFadeOutProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for GridToFadeOut. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty GridToFadeOutProperty = 
     DependencyProperty.Register("GridToFadeOut", typeof(Grid), typeof(ButtonWithAnim)); 

    public Grid GridToFadeIn 
    { 
     get { return (Grid)GetValue(GridToFadeInProperty); } 
     set { SetValue(GridToFadeInProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for GridToFadeIn. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty GridToFadeInProperty = 
     DependencyProperty.Register("GridToFadeIn", typeof(Grid), typeof(ButtonWithAnim)); 

    protected override void OnClick() 
    { 
     ButtonClickHandler(); 
    } 

    public void ButtonClickHandler() 
    { 
     DoubleAnimation fadeOutAnimation = new DoubleAnimation(1.0, 0.0, new TimeSpan(0, 0, 0, 0, 250)); 
     DoubleAnimation fadeInAnimation = new DoubleAnimation(0.0, 1.0, new TimeSpan(0, 0, 0, 0, 250)); 

     fadeOutAnimation.Completed += (sender, eArgs) => 
     { 
      GridToFadeOut.Visibility = Visibility.Collapsed; 
      GridToFadeIn.Visibility = Visibility.Visible; 
      GridToFadeIn.BeginAnimation(Grid.OpacityProperty, fadeInAnimation); 
     }; 

     GridToFadeOut.BeginAnimation(Grid.OpacityProperty, fadeOutAnimation); 
    } 
} 

XAML

<custom:ButtonWithAnim Content="Test Button" Margin="0,10,25,0" 
           Grid.Row="1" Width="75" 
           HorizontalAlignment="Right" 
           GridToFadeOut="{Binding RelativeSource={RelativeSource AncestorType=Grid}}" 
           GridToFadeIn="{Binding ElementName=datePicker}" /> 
0

爲了使其真正通用,應該創建一個自定義控件,其中包含要與故事板操作交換出來的控件。

一旦創建了控件,就可以在頁面上放置1- *這些控件並使它們可見並根據需要執行故事板。