-2

私のタイル エディターには、元に戻すとやり直すという 2 つの TileMaps スタックがあります。ユーザーが変更を行うたびに、マップの状態がスタックに追加され、変更が行われます。これが私の元に戻すコードです:

private void undoToolStripMenuItem_Click(object sender, EventArgs e)
    {
        if (undo.Count != 0)
        {
            redo.Push(tileMap);
            tileMap = undo.Peek();
            undo.Pop();
        }
    }

ただし、マップは変更されません。なんで?

4

3 に答える 3

1

元に戻すとやり直しが単なるスタックオブジェクトである場合、何も起こらないはずです。代わりに、元にたりが発生したときにUIを実際に更新するコードを追加する必要があります。この場合、スタックからポップされた現在のtileMapを使用してマップを再描画すると思います。

于 2011-06-12T20:36:51.063 に答える
1

これが古いスレッドであることは知っていますが、まったく同じ問題に遭遇しました。CurrentItem に渡していたアイテムは、メモリ内で編集していたアイテムと同じであることが判明したため、同じオブジェクトを前後に渡しているだけでした。

この問題は、オブジェクトに Clone 関数を作成してそれ自体の新しいバージョンを返すことで解決しました。元に戻す、やり直し、追加項目の関数が双方向で実行されるたびに、これを行いました。そのようにして、編集中のオブジェクトへの依存を常に削除していました。今ではすべて動作しています:)

于 2021-06-28T12:39:13.427 に答える
0

UIのアップデートの問題じゃないなら…

REDO と UNDO は、異なるスタック オブジェクトを参照していますか? 両方が同じスタック オブジェクトを参照する場合、コードは現在の状態をプッシュ アンド ポップするだけです。

または同様に、同じ tileMap オブジェクトまたはそのコピーへの別の参照をプッシュしていますか? (つまり、おそらくしたいPush(tileMap.DeepCopy()))

また、なぜ Peek してから Pop するのですか? tileMap に直接ポップできます。

于 2011-06-12T21:33:57.737 に答える