3

依存関係プロパティが true に設定されるたびにフラッシュしたい小さな楕円があります。プロパティは数ミリ秒で true から false に非常に迅速に戻るため、単純なスタイルのデータトリガーではなく、アニメーションを使用してこれを行う必要があります。基本的に、楕円のアニメーションに ping を実行する真の値が必要です。

<Ellipse Height="10" Width="10" Stroke="#FFFFFFFF" Margin="5,3,0,0">
    <Ellipse.Fill>
        <SolidColorBrush />
    </Ellipse.Fill>
    <Ellipse.Style>
        <Style>
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsReceiving}" Value="True" >
                    <DataTrigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="Fill.Color">
                                    <ColorAnimationUsingKeyFrames.KeyFrames>
                                        <DiscreteColorKeyFrame KeyTime="0:0:0" Value="Red"/>
                                        <DiscreteColorKeyFrame KeyTime="0:0:0.25" Value="Transparent"/>
                                    </ColorAnimationUsingKeyFrames.KeyFrames>
                                </ColorAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.EnterActions>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Ellipse.Style>
</Ellipse>

このアニメーションは機能しているように見えますが、値が最初に true になったときにのみ起動します。何か不足していますか?

更新: 皆さん、ご意見ありがとうございます。結局のところ、それはスレッドの問題でした。もともと、INotifyPropertyChanged を実装したビュー モデルにバインドされたコントロールに DP がありました。次に、コントロールの DP を削除して、ビュー モデル プロパティを DP に変えてみました。ブーム、別のスレッドがオブジェクトを所有しているというエラーが発生し始めたのはそのときです。アプリの他の部分で行ったように、Reactive Extensions を使用して Observable を組み込む必要があることに気付きました。PropertyChanged() を使用してビュー モデルの従来のプロパティに戻し、それをコントロールのアニメーションに単純にバインドしました。現在、すべてが問題なく機能しています。

4

6 に答える 6

1
 <Ellipse Height="10" Width="10" Stroke="#FFFFFFFF" Margin="5,3,0,0">
        <Ellipse.Fill>
            <SolidColorBrush />
        </Ellipse.Fill>
        <Ellipse.Style>
            <Style>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding IsReceiving,Mode=TwoWay}" Value="True" >
                        <DataTrigger.EnterActions>
                            <BeginStoryboard>
                                <Storyboard>
                                    <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="Fill.Color">
                                        <ColorAnimationUsingKeyFrames.KeyFrames>
                                            <DiscreteColorKeyFrame KeyTime="0:0:0" Value="Red"/>
                                            <DiscreteColorKeyFrame KeyTime="0:0:0.25" Value="Transparent"/>
                                        </ColorAnimationUsingKeyFrames.KeyFrames>
                                    </ColorAnimationUsingKeyFrames>
                                </Storyboard>
                            </BeginStoryboard>
                        </DataTrigger.EnterActions>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Ellipse.Style>
    </Ellipse>

Mode=TwoWay を使用してみてください

于 2012-08-14T09:42:22.933 に答える
0

IsRecoming プロパティの定義を確実に提供する必要があります。このアニメーション効果をトリガーする True と False を切り替えるプロパティ (IsRecoming) があるという仮定に基づいています。

1) プロパティが DependencyProperty であるか、INotifyPropertyChanged を正しく利用してビューへの更新を通知していることを確認します。
2) プロパティ セッターが実際に True から False へ、またはその逆に変化していることを確認します。

于 2012-08-14T04:18:13.920 に答える
0

問題を再現できません。ここに私のコードビハインドがあります:

public partial class MainWindow : Window
{
    public static readonly DependencyProperty IsReceivingProperty =
        DependencyProperty.Register("IsReceiving",
                                    typeof(bool), typeof(MainWindow));

    public bool IsReceiving
    {
        get { return (bool)GetValue(IsReceivingProperty); }
        set { SetValue(IsReceivingProperty, value); }
    }

    public MainWindow()
    {
        InitializeComponent();

        myEllipse.DataContext = this;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        this.IsReceiving = true;
        this.IsReceiving = false;
    }
}
于 2012-08-14T12:02:32.807 に答える