0

スタックを使用して単純な UndoRedo フレームワークを作成していますが、何らかの理由で何かが機能していません。オブジェクトのプロパティ、この場合は ColorBlend を格納するコードがあります。

public static ColorBlend _BG_Blend = new ColorBlend();
public ColorBlend BG_Blend
{
    get { return _BG_Blend; }
    set
    {
        AddLog("BG_Blend", _BG_Blend); //Name && Property Value
        _BG_Blend = value;                   
    }
}

これで、ブレンドを変更するたびに、新しいプロパティがスタックに保存され、新しいアクションを元に戻すことができるというシグナルが送信されます。ログに 5 つの異なる ColorBlends があるとします。[元に戻す] をクリックすると、保存されているプロパティが返されますが、それらはすべて同じ色を持ち、すべてを配置します。誰でも理由を知っていますか?

4

4 に答える 4

3

それへの参照を変更 BG_Blendしてスタックに保存すると、スタック内のすべての参照が同じインスタンスを指します。スタックに格納するときは、新しいインスタンスを作成する必要があります。変更前の のコピーをColorBlend作成し、そのコピーをスタックに格納します。

于 2013-03-09T22:16:03.380 に答える
1

あなたが割り当てるセッターで

_BG_Blend = value;                   

あなたが返すゲッターで

return _BG_Blend;

したがって、はい、スタックに何があるかに関係なく、最後に割り当てられた値を取得します。

ゲッターでは、バッキング フィールドの値ではなく、スタックから値を返す必要があるようです。

于 2013-03-09T22:10:04.170 に答える
1

問題は、常に同じオブジェクト参照をスタック (つまり_BG_Blend) に格納することです。これは、スタック内の各エントリが同じオブジェクトを指すことを意味し、より正確には、最後に挿入したオブジェクトを指します。ブレンドごとに、新しい参照を保存する必要があります。

于 2013-03-09T22:17:12.537 に答える
0

_BG_Blendメンバー変数はstaticであるため、そのインスタンスは 1 つしかありません。新しいブレンドをプッシュするたびに、静的変数を新しい値で上書きしますが、すべての元に戻すステップはこの単一の共有値を指すだけなので、それらはすべてそれによって「上書き」されます。

staticモディファイヤを削除するだけです。

于 2013-03-09T22:28:14.763 に答える