28

現在、選択したアイテムがViewModelのプロパティにバインドされているリストボックスがあります。選択したアイテムがnullでない場合は常に、アニメーションを実行したいと思います。ただし、 「このストーリーボードタイムラインツリーをスレッド間で使用するためにフリーズできません」というエラーが発生し続け、調査から、なぜこれが発生しているのかがわかります。しかし、私は自分が望む行動をとるためにどのようなアプローチを取る必要があるのか​​わかりません。

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

3 に答える 3

43

ストーリーボードを投稿できますか?ストーリーボードの定義に何らかのバインディングがあるようです。


さて、私が推測したように、それはあなたがBindingあなたのでを使用しているからですStoryboard。WPFは効率を上げるためにテンプレートによって利用されるすべてのリソースをフリーズしようとするため、これを行うことはできません。また、でバインディングを使用するFreezableと、この場合はStoryboardフリーズできなくなります。

于 2009-11-03T20:00:46.700 に答える
11

Freezable の問題を回避するために使用できるテクニックがあり、アニメーションの "To" 値にバインディングを使用できます (そこに値をハードコーディングするのではなく)。それはかなり簡単で、ここで概説しました。

于 2013-01-30T16:34:30.600 に答える
3

古い質問ですが、他の人にも役立つかもしれません。コードビハインドでストーリーボードを作成する方が簡単な場合があります: https://stackoverflow.com/a/10848781/779521

于 2012-06-01T10:44:18.993 に答える