Поместить раскадровку в ресурсы приложения

Мне нужно использовать одну и ту же раскадровку в нескольких местах, поэтому я поместил раскадровку в свой Application.Resources. Когда я пытаюсь выполнить раскадровку, единственная проблема заключается в том, что мне нужно ссылаться на цель, которую я хочу оживить. Вот моя раскадровка:

    <System:String x:Key="target">border2</System:String>
    <Storyboard x:Key="stHeight">
        <DoubleAnimationUsingKeyFrames 
            Storyboard.TargetProperty="(FrameworkElement.Height)" 
            Storyboard.TargetName="{DynamicResource target}"> 
            <EasingDoubleKeyFrame KeyTime="0:0:1" Value="90">
                <EasingDoubleKeyFrame.EasingFunction>
                    <CircleEase EasingMode="EaseOut"/>
                </EasingDoubleKeyFrame.EasingFunction>
            </EasingDoubleKeyFrame>
        </DoubleAnimationUsingKeyFrames>
    </Storyboard>

я анимирую высоту другого объекта путем изменения цели динамического ресурса. Я смог сделать это, когда раскадровка была в текущем окне. Но теперь, когда я хочу разместить его в ресурсах приложения, я не знаю, как ссылаться на целевое свойство.


РЕДАКТИРОВАТЬ

Решение, которое я опубликовал ранее, работает хорошо, но иногда сложно создать сложную анимацию с помощью кода. поэтому я разработал еще одно альтернативное решение - создать раскадровку со смесью выражений. поэтому я перетаскиваю случайный элемент управления в главное окно в наложении выражений и создаю случайную анимацию. скажем, анимация выглядит как:

         <Storyboard x:Key="Storyboard1">
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="grid">
                <EasingDoubleKeyFrame KeyTime="0:0:1" Value="90"/>
            </DoubleAnimationUsingKeyFrames>
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)" Storyboard.TargetName="grid">
                <EasingDoubleKeyFrame KeyTime="0:0:1" Value="103"/>
            </DoubleAnimationUsingKeyFrames>
            <PointAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransformOrigin)" Storyboard.TargetName="grid">
                <EasingPointKeyFrame KeyTime="0:0:1" Value="0.75,0.5"/>
            </PointAnimationUsingKeyFrames>
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)" Storyboard.TargetName="grid">
                <EasingDoubleKeyFrame KeyTime="0:0:1" Value="75"/>
            </DoubleAnimationUsingKeyFrames>
        </Storyboard>

, затем я копирую этот код и вставляю его в свое рабочее окно НЕ В APP.XAML.

, а затем в моем коде, скажем, у меня есть:

<Border Name="brdBorder" BorderBrush="Silver" BorderThickness="1" Margin="328,104,0,0"  Background="#FFE52E2E" HorizontalAlignment="Left" Width="94" Height="100" VerticalAlignment="Top" >
    <Border.RenderTransform>
        <TransformGroup>
            <ScaleTransform/>
            <SkewTransform/>
            <RotateTransform/>
            <TranslateTransform/>
        </TransformGroup>
    </Border.RenderTransform>
</Border>

по какой-то причине группа преобразования должна быть там, чтобы оживить объект. в любом случае, допустим, что у меня есть эта граница в моем рабочем окне, и я хочу анимировать ее той же анимацией, которую я создал с помощью наложения выражений. то, что я сделаю в коде:

Storyboard sb1 = FindResource("Storyboard1") as Storyboard;

foreach (var child in sb1.Children)
{
    Storyboard.SetTargetName(child, brdBorder.Name);
}

sb1.Begin(this);

, а затем я смогу анимировать эту границу в моем рабочем окне. Приятная часть этого заключается в том, что я могу применить одну и ту же анимацию к нескольким объектам (я думаю, это цель создания ресурса), проблема возникает, когда я пытаюсь разместить раскадровку в словаре ресурсов или в app.xaml файл. когда я это делаю, C # может найти раскадровку, но свойства раскадровки доступны только для чтения, поэтому я получаю сообщение об ошибке:

Cannot set a property on object 'System.Windows.Media.Animation.DoubleAnimationUsingKeyFrames' because it is in a read-only state.

Причина, по которой я хотел сделать это, - применить одну и ту же анимацию к нескольким объектам. Обходным решением было создание базовой анимации с помощью кода, а затем более сложная анимация, такая как функция замедления и т. Д., Сохранение ее в качестве ресурса. Позвольте мне показать вам, что я имею в виду.

В моем файле ресурсов я разместил следующий ресурс:

   <EasingDoubleKeyFrame x:Key="pleaseWork">
        <EasingDoubleKeyFrame.EasingFunction >
            <BackEase EasingMode="EaseOut" Amplitude="1"/>
        </EasingDoubleKeyFrame.EasingFunction>
    </EasingDoubleKeyFrame>

В смеси выражений вы можете построить более сложную функцию легкости. Затем с помощью кода я создам базовую раскадровку:

DoubleAnimation animation = new DoubleAnimation();
            animation.To = 336;   // final value
            //animation.From = 0;
            //animation.BeginTime = TimeSpan.FromSeconds(0); 
            animation.Duration = new Duration(TimeSpan.FromSeconds(5)); // how much time should animation last
            // here comes the magic:
            // note that I can bind to EasingDoubleKeyFrame in my resource file in xaml
            animation.EasingFunction = ((EasingDoubleKeyFrame)FindResource("pleaseWork")).EasingFunction; // apply the easing function 
            Storyboard.SetTarget(animation, groupBox1);  // what object will be animated?
            Storyboard.SetTargetProperty(animation, new PropertyPath(FrameworkElement.HeightProperty)); // what property will be animated

            Storyboard sb = new Storyboard();
            sb.Children.Add(animation);
            sb.Begin();

Это позволило мне использовать одну и ту же раскадровку для нескольких объектов.

10
задан casperOne 14 August 2012 в 14:59
поделиться