3

ウィンドウのスタイルを持つリソース ディクショナリがあります。このスタイルでは、テンプレートを定義し、そこで多くのものを定義します。とりわけ、テンプレートで定義されている特定のものをアニメーション化するストーリーボードを定義します。次のようになります。

<Style TargetType="local:MyWindow">
    <Setter Property="Background" Value="red" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:MyWindow">
                <Grid>
                    <Grid.Resources>
                        <Storyboard x:Key="MyAnimation">
                            <DoubleAnimation Storyboard.TargetName="ToBeAnimated" ... />
                        </Storyboard>
                    </Grid.Resources>
                    <Grid x:Name="ToBeAnimated" Background="Green"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

今、私はMyWindowのインスタンスを持っています(これは間違いなくスタイルを適用します:))そしてウィンドウ内からアニメーションをトリガーしたいです。しかし、これは

this.FindResource("MyAnimation");

失敗します!

ストーリーボードを

<ControlTemplate.Resources/>

それはそれを見つけることができますが、私が見つけた場合

((Storyboard)FindResource("StoryboardOpenOverlay")).Begin();

見つからないという別のエラーが表示されますToBeAnimated...

何か案は?

4

2 に答える 2

3

グリッドに名前を追加し、テンプレート化された部分を使用してその参照を取得することができます:
-MyWindow[TemplatePart(Name = "gridName",DataGrid.headerName, Type = typeof(Grid))]クラスに追加します
-そして OnApplyTemplate を実装します:

    protected override void OnApplyTemplate()
    {
        Grid grid = this.GetTemplateChild("gridName") as Grid;
        if (grid != null)
        {
            Storyboard storyboard = grid.Resources["MyAnimation"] as Storyboard ;

        }
        base.OnApplyTemplate();
    }
于 2013-09-13T12:24:14.113 に答える
1

ストーリーボードは に配置されていますがGrid、これを試してください。

((Grid)this.Content).FindResource("MyAnimation");

または、可能であれば、

this.ToBeAnimated.FindResource("MyAnimation");
于 2013-09-13T12:11:14.190 に答える