2009-11-03 7 views
19

Ich habe derzeit ein Listenfeld, dessen ausgewähltes Objekt an eine Eigenschaft in meinem ViewModel gebunden ist. Wenn das ausgewählte Element nicht null ist, möchte ich eine Animation darauf ausführen. Allerdings bekomme ich immer den folgenden Fehler "Kann diesen Storyboard-Timeline-Baum für die Verwendung über Threads nicht einfrieren" und aus der Forschung zu verstehen, warum dies geschieht. Ich bin mir jedoch nicht sicher, welchen Ansatz ich wählen muss, um das Verhalten zu erreichen, das ich möchte.WPF-Animation "Dieser Storyboard-Timeline-Baum kann nicht über Threads hinweg eingefroren werden"

<Storyboard x:Key="ShowItemEdit"> 
    <DoubleAnimation 
     Storyboard.TargetName="lstItemList" 
     Storyboard.TargetProperty="ListBox.Width" 
     To="{Binding ActualWidth, ElementName=UserControl}" 
     Duration="0:0:0.40" /> 
    ... 
</Storyboard> 

<Style x:Key="ListStyle"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding SelectedItem, Converter={StaticResource IsNullConverter}}" Value="False"> 
      <DataTrigger.EnterActions> 
      <BeginStoryboard Storyboard="{StaticResource ShowItemEdit}" /> 
     </DataTrigger.EnterActions> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

<ListBox x:Name="lstItemList" Style={StaticResource ListStyle}" SelectedItem="{Binding SelectedItem}"> 
    ... 
</ListBox> 

Antwort

25

Können Sie Ihr Storyboard posten? Es klingt, als hättest du eine Art von Bindung in der Storyboard-Definition.


Ok, so, wie ich vermuten, dann ist es, weil Sie ein Binding in Ihrem Storyboard verwenden. Sie können dies nicht tun, weil WPF versucht, alle Ressourcen, die durch eine Vorlage für Effizienz genutzt werden, zu freeze und wenn Sie eine Bindung auf eine Freezable verwenden, in diesem Fall die Storyboard, verhindert es, dass es eingefroren werden kann.

+0

Ich habe den Storyboard-Code hinzugefügt. Ich binde die 'To' Eigenschaft, da ich die Breite nicht hartcodieren möchte. – jwarzech

+0

Das ist dann dein Problem, werde ich erklären. –

+0

Danke für die Erklärung! Irgendwelche Vorschläge, wie ich dieses Storyboard (mit Bindung) erreichen kann, ohne den Datentrigger mit dem Control verbinden zu müssen? – jwarzech

5

Es ist eine Technik, die Sie rund um das Freezable Problem verwenden können zu erhalten, die Sie eine Bindung für den „To“ Wert von verwenden können Sie Ihre Animation (anstatt einen Wert dort hart-kodieren). Es ist ziemlich einfach und ich habe es umrissen here.

Verwandte Themen