WPF动画:无法将属性绑定到ActualWidth

时间:2014-04-02 12:18:39

标签: wpf binding wpf-controls wpf-animation

我试图通过以下方式更改选定的TabItem的宽度:

<Style TargetType="{x:Type TabItem}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TabItem}">
                <Grid x:Name="Root">
                    <Border x:Name="Border" Background="{TemplateBinding Background}">
                        <ContentPresenter x:Name="ContentSite" VerticalAlignment="Center" HorizontalAlignment="Stretch" ContentSource="Header" Margin="12,2,12,2"/>
                    </Border>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsSelected" Value="True">
            <Trigger.EnterActions>
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetProperty="Width" 
                                                     From="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabItem}, Mode=FindAncestor}, Path=ActualWidth}" 
                                                     To="200" 
                                                     Duration="0:0:1"/>
                    </Storyboard>
                </BeginStoryboard>
            </Trigger.EnterActions>
        </Trigger>
    </Style.Triggers>
</Style>

我被迫指定&#34; From&#34;动画的属性,因为我没有指定&#34;宽度&#34; TabItem的属性是显式的,它由自定义布局容器计算。 但当我试图绑定&#34;来自&#34;动画的属性为&#34; ActualWidth&#34; TabItem的属性,System.Windows.Controls.TabItem&#39;的初始化。抛出一个例外。我试图移动&#34; Triggers&#34; &#34; ControlTemplate&#34;部分,但没有效果。所以我有两个问题:

1)为什么&#34; From&#34;属性以我的方式绑定到TabItem的ActualWidth?

2)我怎样才能达到预期的行为?

任何提示都将不胜感激。

1 个答案:

答案 0 :(得分:0)

这是不可能的,因为WPF框架最初会冻结用于动画的东西,所以如果你试图在Freezable上绑定,它就会接受它。这就是为什么它无法改变并说,

无法冻结此Storyboard时间轴树以供跨线程使用