Получить элемент Framework из раскадровки

У меня есть ссылка на экземпляр объекта 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 Completed. Это позволит мне делать чистый MVVM, а не нуждаться в некотором коде для вызова моей модели представления.


person Mark Heath    schedule 18.09.2009    source источник


Ответы (1)


Если вы изменили свой 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);
person Ray Booysen    schedule 18.09.2009
comment
Спасибо, это работает! цель раскадровки должна быть labelHello, чтобы поведение оставалось прежним, и это означает, что мне не нужно называть сетку. Подожду и посмотрю, сможет ли кто-нибудь сделать это без изменений XAML, прежде чем я отмечу это как ответ, поскольку я хочу, чтобы мое прикрепленное свойство было единственной необходимой разметкой. - person Mark Heath; 18.09.2009