代码之家  ›  专栏  ›  技术社区  ›  Mark Heath

从故事板获取框架元素

  •  1
  • Mark Heath  · 技术社区  · 15 年前

    例如,在下面的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>
    

    对于那些想知道我到底为什么需要这样做的人来说,这是因为我试图创建一个派生的故事板类或一个附加的行为,允许我在DataContext上指定一个方法名,以便在故事板完成事件触发时调用。这将允许我执行纯MVVM,而不需要一些代码来调用视图模型。

    1 回复  |  直到 12 年前
        1
  •  1
  •   Ray Booysen    15 年前

    如果将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,并在动画中引入一个故事板.Target。现在,您可以使用以下代码获取对网格的引用:

    Storyboard sb = //You mentioned you had a reference to this.
    var timeLine = sb.Children.First();
    var myGrid = Storyboard.GetTarget(timeLine);