如何以编程方式更改/替换模板中的StoryBoard?

时间:2012-04-21 17:36:16

标签: c# wpf xaml storyboard

我正在弄清楚如何在我的WPF窗口中更改故事板的一个属性。

我的窗口有一个动画,可以通过“卷起”动画来减小窗口的大小。根据某些条件(是否设置了某个道具),我们希望窗口更长一些,以适应额外的项目。

我一直在使用this.FindResource()来抓取元素,这没问题。但是当然,故事板被冻结了,其中包含的DoubleAnimations被冻结了,所以我无法改变任何东西。

所以我想,好吧,我只是换掉整个故事板。

<Trigger Property="IsMouseOver" Value="True">
    <Trigger.ExitActions>
        <BeginStoryboard Storyboard="{StaticResource ToolbarCollapse_NoIB}" />
    </Trigger.ExitActions>
</Trigger>

我在想,通过编程方式,我可以进入代码隐藏并更改触发器以使用ToolbarCollapse_YesIB。

在那次尝试中,我可以做到这一点:

var tbTemplate = (ControlTemplate)this.FindResource("ToolbarTemplate");
var newStoryboard = (Storyboard)this.FindResource("ToolbarCollapse_YesIB");
tbTemplate.Triggers[2].ExitActions[0] = ??? needs to be a TriggerAction

这就是我被困住的地方。如何为该Storyboard创建TriggerAction?构造函数并不真正适用于此,也不适用于方法。

这些课程的文档让我觉得自己偏离了轨道。

任何人都可以帮助我使这种方法有效,或者让我知道另一种更好的方法吗?

1 个答案:

答案 0 :(得分:0)

我想出了一种使用替代方法的解决方案。似乎它可能有点hacky,但它确实有效。

我创建了两个故事板ToolbarCollapse_YesIBToolbarCollapse_NoIB。它们只有高度属性不同。

然后我用两个MultiTriggers替换了原来问题的Trigger:

<MultiTrigger>
    <MultiTrigger.Conditions>
        <Condition Property="IsMouseOver" Value="True"/>
        <Condition Property="MinHeight"
                   Value="{StaticResource ToolbarCollapsedHeight_YesIB}"/>
    </MultiTrigger.Conditions>
    <MultiTrigger.ExitActions>
        <BeginStoryboard Storyboard="{StaticResource ToolbarCollapse_YesIB}" />
    </MultiTrigger.ExitActions>
</MultiTrigger>

<MultiTrigger>
    <MultiTrigger.Conditions>
        <Condition Property="IsMouseOver" Value="True"/>
        <Condition Property="MinHeight"
                   Value="{StaticResource ToolbarCollapsedHeight_NoIB}"/>
    </MultiTrigger.Conditions>
    <MultiTrigger.ExitActions>
        <BeginStoryboard Storyboard="{StaticResource ToolbarCollapse_NoIB}" />
    </MultiTrigger.ExitActions>
</MultiTrigger>

我使用对象的构造函数来设置MinHeight。根据我的IB字段的存在,我将MinHeight设置为ToolbarCollapsedHeight_YesIB_NoIB

现在,如果MinHeight=(my YesIB size),则一个故事板处于活动状态。如果MinHeight=(my NoIB size),则另一个故事板处于活动状态。

(我实际上有另外一对ToolbarExpand_YesIB/NoIB模板,在上述触发器中分配给MultiTrigger.EnterActions,但为了简洁我将它们遗漏了。)

这是对屁的真正痛苦。我希望这有助于其他找到类似情况的人。