Попытка перенести в WPF некоторое поведение из старого приложения Silverlight, которое позволяло пользователям настраивать свое представление, перемещая/минимизируя/максимизируя различные элементы управления UserControl. Несколько StoryBoard были объявлены в UserControl.Resources и позже доступны из кода через их x:Name.
<Storyboard x:Name = "MaximizeStoryboard" Completed = "MaximizeStoryboard_Completed" Storyboard.TargetName = "WholeControl">
<DoubleAnimationUsingKeyFrames BeginTime = "00:00:00" Storyboard.TargetProperty = "(FrameworkElement.Width)">
<SplineDoubleKeyFrame x:Name = "MaximizeWidth" KeyTime = "00:00:00.3000000" Value = "0"/>
</DoubleAnimationUsingKeyFrames>
...
В WPF после изменения x:Name на x:Key я могу получить доступ к раскадровке через:
Storyboard maximizeStoryboard = (Storyboard)Resources["MaximizeStoryboard"];
Бывшего употребления
MaximizeWidth.Value = Container.Contents.ActualWidth;
чтобы установить ширину восстановления (и другие значения) из кода перед началом анимации. Это не работает в WPF. Каков правильный способ получить доступ, чтобы эти значения можно было установить из кода?





Одним из возможных способов может быть пройти через детей Storyboard, найти DoubleAnimationUsingKeyFrames ребенка, а затем получить первого KeyFrame.
Storyboard maximizeStoryboard = (Storyboard)Resources["MaximizeStoryboard"];
var doubleAnimationUsingKeyFrames = maximizeStoryboard.Children.OfType<DoubleAnimationUsingKeyFrames>().FirstOrDefault();
if (doubleAnimationUsingKeyFrames != null)
{
if (doubleAnimationUsingKeyFrames.KeyFrames.Count > 0)
{
var keyFrame = doubleAnimationUsingKeyFrames.KeyFrames[0] as SplineDoubleKeyFrame;
if (keyFrame !=null)
{
keyFrame.Value = Container.Contents.ActualWidth;
}
}
}
Спасибо. Это работает. Если нет грубого эквивалента возможности доступа к свойству через x:Name, похоже, что в WPF объявление анимации в xaml не имеет большого значения. Наверное, так же просто всю анимацию сделать в коде?