2016-06-09 4 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 * из этих элементов управления на странице и сделать их видимыми и выполнить раскадровку (ы) по мере необходимости.

Смежные вопросы