質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

2029閲覧

C# wpf InkCanvasのUndo/Redoの実装

kkjiji

総合スコア40

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2021/12/09 08:40

前提・実現したいこと

C# wpfにてペイントソフトを作ろうと思っています。
実現したいことはペンで書いたり、四角や丸を描写したことをUndo/Redoできるようにしたいと思っています。
Undo/Redoは書いたこと、消したこと、塗りつぶしたことなどInkCanvasで起こったことすべての動作を記憶したいです。
Undo/Redoできる回数は何回でもいいですが、10回程度を想定しています。

現在、ペンはInkCanvasのInkCanvasEditingMode.Inkを、四角や丸はRectangleやEllipseでInkCanvas.Children.Addしています。

発生している問題・エラーメッセージ

C#を勉強して、2週間ほどなので使い方が正しいかどうか分からないのですが、
想定したやり方は2つです。

1.スタックを使ってInkCanvas自体を記録
Stack<InkCanvas> ~ = new Stack<InkCanvas>();
で現在のInkCanvasの状態を丸々スタックできないかと思ったのですが、できなかったです。

2.Listを使って、書いたものすべてを記録(他サイトのものを参考)
penはStroke、四角や丸はObjectなので一緒に保存ができないので書いた順番をどう記録したいか分からなかったです。

長くなりましたが、上記の方法できるあるいは他の方法でもいいので良い案があれば、ぜひお力添えお願いします。

補足情報(FW/ツールのバージョンなど)

・Visual Studio2019

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TN8001

2021/12/09 08:59

前回の回答のように**図形もストロークで描いて**いれば、 InkCanvas.Strokes.StrokesChangedで、Added・Removedがあるので管理できると思います。 [StrokeCollectionChangedEventArgs クラス (System.Windows.Ink) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.ink.strokecollectionchangedeventargs?view=net-6.0 ↓は1回だけっぽいですが、Stackなり何かライブラリなりを使えばいいでしょう。 [wpf - undo/redo command stack for InkCanvas - Stack Overflow](https://stackoverflow.com/questions/6368517/undo-redo-command-stack-for-inkcanvas/52911463#52911463
kkjiji

2021/12/09 09:09

ご回答ありがとうございます。 2つとも以前拝見しました。 どちらも参考になるサイトだと思うのですが、 InkCanvas.Strokes.StrokesChangedだとStrokeしか管理できないと思っています。 EllipseやRectangleが子要素に追加されたときも動作できるのですか? 無知ですみません。よければ、ご回答お願いします。
TN8001

2021/12/09 09:15

いや、だから前の回答をちゃんと読んでください。 回答コードでは図形をストロークで追加しているのです。 コピペするだけですから、実行してみてください^^;
kkjiji

2021/12/09 09:23

あ、すみません。 同じ方だったんですね。 やってみようと思います。 親切に答えてくださって、本当に助かります。 ありがとうございます。
guest

回答1

0

自己解決

InkCanvasの子要素をforeachでListに入れた後、Stackに積み重ねることで実装できました。

投稿2022/01/29 13:28

kkjiji

総合スコア40

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問