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

您可以在 Grid 上添加一个名称并使用模板化部分来获取它的引用,为此:-添加您的 MyWindow 类-并实现
OnApplyTemplate :[TemplatePart(Name = "gridName",DataGrid.headerName, Type = typeof(Grid))]

    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 回答