Мне нужно использовать одну и ту же раскадровку в нескольких местах, поэтому я разместил раскадровку внутри своего приложения. Ресурсы. Когда я пытаюсь выполнить раскадровку, единственная проблема заключается в том, что мне нужно ссылаться на цель, которую я хочу оживить. Вот моя раскадровка:
<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>
способ анимации другой высоты объекта - это изменение цели динамического ресурса. Я смог сделать это, когда раскадровка находилась в текущем окне. Но теперь, когда я хочу разместить его в ресурсах приложения, я не знаю, как ссылаться на целевое свойство.
EDIT
Решение, которое я опубликовал ранее, работает хорошо, но иногда сложно создавать сложные анимации с кодом. поэтому другое альтернативное решение, которое я разработал, состояло в том, чтобы создать раскадровку с помощью выражения blend. поэтому я перетаскиваю случайный элемент управления в главное окно в виде blend и создаю случайную анимацию. скажем, анимация выдается как:
<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>
по какой-то причине группа преобразования должна быть там, чтобы анимировать объект. в любом случае позвольте сказать, что у меня есть этот пограничник в моем рабочем окне, и я хочу оживить его с той же анимацией, которую я создал с помощью выражения blend. что я буду делать в коде:
Storyboard sb1 = FindResource("Storyboard1") as Storyboard;
foreach (var child in sb1.Children)
{
Storyboard.SetTargetName(child, brdBorder.Name);
}
sb1.Begin(this);
а затем я могу анимировать эту рамку в рабочем окне. Приятная часть этого заключается в том, что я могу применить одну и ту же анимацию к нескольким объектам (цель создания ресурса, я думаю), проблема возникает, когда я пытаюсь разместить раскадровку в словаре ресурсов или в app.xaml файл. когда я это делаю, С# может найти раскадровку, но свойства раскадровки читаются только поэтому я получаю ошибку:
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>
В expresion blend вы можете создать более сложную функцию облегчения. Затем с кодом позади я создам базовую раскадровку:
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();
Это позволило мне использовать одну и ту же раскадровку для нескольких объектов.