2014-04-02 66 views
1

我想通過以下方式來更改所選的TabItem的寬度:WPF動畫:不能從屬性綁定到ActualWidth的

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

我被迫指定「從」屬性爲因爲我沒有明確指定TabItem的「Width」屬性,所以它由自定義佈局容器計算。 但是當我嘗試將動畫的「From」屬性綁定到TabItem的「ActualWidth」屬性時,「System.Windows.Controls.TabItem」的初始化引發異常。我試圖移動「ControlTemplate」部分中的「觸發器」部分,但沒有任何效果。所以我有兩個問題:

1)爲什麼不能以我的方式將「From」屬性綁定到TabItem的ActualWidth?

2)我該如何達到理想的行爲?

任何提示將不勝感激。

+0

如果不指定'From',它是如何使用的行爲? – Sankarann

+0

@Sankarann,它引發異常「無法使用'System.Windows.Media.Animation.DoubleAnimation'在'System.Windows.Controls.TabItem'上爲'Width'屬性設置動畫。 – undermind

+0

硬編碼中的某些值,工作正常嗎? – Sankarann

回答

0

這是做不到的,因爲WPF框架會凍結最初用於動畫的東西,所以如果你試圖在Freezable上綁定,它會接受。這就是爲什麼它被更改阻止,並說,

不能凍結這個故事板時間表樹跨線程