Получить элемент Framework из раскадровки
-
22-07-2019 - |
Вопрос
У меня есть ссылка на экземпляр объекта Storyboard, и я хочу получить элемент Framework, к которому он прикреплен / анимируется. Я не смог придумать никакого способа сделать это.
Например, в приведенном ниже XAML я могу перейти от ссылки к раскадровке, чтобы получить метку или сетку
<Grid>
<Grid.Resources>
<Storyboard x:Key="myStoryboard">
<DoubleAnimation Storyboard.TargetProperty="Opacity" From="1" To="0" Duration="0:0:5"/>
</Storyboard>
<Style x:Key="myStyle" TargetType="{x:Type Label}">
<Style.Triggers>
<DataTrigger
Binding="{Binding Path=StartAnimation}" Value="true">
<DataTrigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource myStoryboard}" />
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Resources>
<Label x:Name="labelHello" Grid.Row="0" Style="{StaticResource myStyle}">Hello</Label>
</Grid>
Для тех, кто интересуется, зачем мне это нужно делать, это потому, что я пытаюсь создать производный класс Storyboard или присоединенное поведение, которое позволит мне указать имя метода в DataContext, который будет вызываться после завершения Storyboard. событие пожары. Это позволит мне создавать чистый MVVM, а не код, чтобы вызывать мою модель представления.
Решение
Если вы изменили свой XAML на что-то вроде этого:
<Grid x:Name="grid">
<Grid.Resources>
<Storyboard x:Key="myStoryboard">
<DoubleAnimation Storyboard.TargetProperty="Opacity" From="1" To="0" Duration="0:0:5" Storyboard.Target="{Binding ElementName = grid}"/>
</Storyboard>
<Style x:Key="myStyle" TargetType="{x:Type Label}">
<Style.Triggers>
<DataTrigger
Binding="{Binding Path=StartAnimation}" Value="true">
<DataTrigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource myStoryboard}" />
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Resources>
<Label x:Name="labelHello" Grid.Row="0" Style="{StaticResource myStyle}">Hello</Label>
</Grid>
Это вводит x: Name в сетку и Storyboard.Target для DoubleAnimation. Теперь вы можете получить ссылку на сетку с помощью этого кода:
Storyboard sb = //You mentioned you had a reference to this.
var timeLine = sb.Children.First();
var myGrid = Storyboard.GetTarget(timeLine);