У меня есть раскадровка, которая нацелена на элемент и привязывает одно из своих свойств к свойству другого элемента:
<Storyboard>
<DoubleAnimation
Storyboard.TargetProperty="RenderTransform.X"
From="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=ActualWidth}"
To="0"
Duration="0:0:5"/>
</Storyboard>
Эта раскадровка работает, когда раскадровка хранится в ресурсах окна, в котором находится цель раскадровки. Значение «От» правильно связано с ActualWidth экземпляра главного окна.
Однако мне нужно хранить раскадровку в ресурсах моего уровня приложения. Отсюда раскадровка, кажется, не в состоянии ориентироваться на окно, чтобы определить свойство «От». Это понятно, поскольку внутри <Application.Resources>
привязка не сможет найти «предка» типа Window.
Думаю, мне нужно иметь возможность связать значение «От» относительно цели анимации, а не относительно DoubleAnimation
раскадровки.
Возможно ли это, и если да, то как?
Вот пример MainWindow.xaml:
<Window.Resources>
<!--This works : Storyboard correctly sets 'From' property to 'ActualWidth' of window-->
<Storyboard x:Key="localStoryBoard">
<DoubleAnimation
Storyboard.TargetProperty="RenderTransform.X"
From="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=ActualWidth}"
To="0"
Duration="0:0:5"/>
</Storyboard>
</Window.Resources>
<StackPanel>
<Button
RenderTransformOrigin="0,1"
HorizontalAlignment="Left"
Content="Click me">
<Button.RenderTransform>
<TranslateTransform/>
</Button.RenderTransform>
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<EventTrigger.Actions>
<BeginStoryboard Storyboard="{StaticResource centralStoryBoard}"/>
</EventTrigger.Actions>
</EventTrigger>
</Button.Triggers>
</Button>
</StackPanel>
А вот пример app.xaml:
<Application x:Class="WpfApplication3.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<Application.Resources>
<!--Storyboard doesn't work at all-->
<Storyboard x:Key="centralStoryBoard">
<DoubleAnimation
Storyboard.TargetProperty="RenderTransform.X"
From="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=ActualWidth}"
To="0"
Duration="0:0:5"/>
</Storyboard>
</Application.Resources>
</Application>
Это не будет работать, так как eventtrigger ссылается на версию app.xaml. Если вы измените его на версию локального ресурса, вы увидите, что он работает.