1

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>

一体なぜこれを行う必要があるのか​​疑問に思っている人のために、ストーリーボード完了イベントが発生したときに呼び出されるDataContextのメソッド名を指定できる派生ストーリーボードクラスまたはアタッチされた動作を作成しようとしているためです。これにより、ビューモデルを呼び出すためにコードを背後に置く必要がなく、純粋なMVVMを実行できるようになります。

4

1 に答える 1

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);
于 2009-09-18T10:54:58.697 に答える