0

ユーザーがテーブル、段落、ハイパーリンク、画像などを追加できる編集可能な RichTextBox があります。ユーザーが画像を挿入すると、プログラムは選択した場所からアプリケーションの宛先ディレクトリに画像のコピーを作成し、この新しいソースを Image オブジェクトに設定します。

ユーザーは RichTextBox から画像を削除できるようになりました。この場合、アプリケーションはディレクトリから画像ファイルも削除する必要があります。コンテンツが削除されたときに FlowDocument で発生するイベントを見つけようとしました。私が見つけたそのようなイベントはありません。

別の方法として、Image オブジェクトの Unloaded イベントを使用することにしました。画像が削除されると、Unloaded イベントが適切に (2 回) 発生し、ファイルを削除するコードが機能します。ここでの問題は、RichTextBox が TabItem に配置されていることです。別のタブ項目に移動すると、Image オブジェクトが Unloaded イベントを発生させ、ファイルが削除されます。この問題を解決するために、Unloaded イベント中に Image オブジェクトのプロパティの変化を検出しようとしました。Parent プロパティを使用できることがわかりました。FlowDocument の Image オブジェクトの親は InlineUIContainer です。そのため、画像が削除された場合、InlineUIContainer の Parent は null になります (フォーカスが他の TabItem に移動した場合は null ではありません)。これにより、画像ファイルを削除することに同意できます。これは、必要に応じて機能します。

しかし、画像が選択範囲に入ると問題が始まります。この場合、Unloaded イベントが発生しますが、InlineUIContainer の Parent は null ではありません。たどった -

  1. 画像は段落にあり、段落の親は null になります。
  2. 画像は TableCell にあり、Table の親は null になります。
  3. 画像は ListItem にあり、List の Parent は null になります。

イメージは、ツリー内で非常に深くなる可能性があります。そのため、各コンテナの親を確認するのは面倒です。

次に、Delete/Backspace キーを押して、選択したコンテンツの XAML を取得することを考えました。このようにして、XML API を使用して選択に該当する Image タグを解析し、それらのファイルを削除します。RichTextBox の選択範囲をファイルに保存するコードを書いてみました。Tables、List、Paragraph などの選択されたすべての要素は、結果の XAML で使用できますが、Image は何らかの理由で選択から除外されます。次のコードを書いています。

var stream = new System.IO.FileStream("e:\\check.xml", System.IO.FileMode.Create);
rtfMain.Selection.Save(stream, DataFormats.Xaml, true);
stream.Close();

要約すると、コンテンツ (画像、ハイパーリンクなど) が FlowDocument から削除され、参照ファイルが削除されているかどうかを知りたいだけです。しかし、どういうわけか、解決策は非常にとらえどころのないようです。

よろしくお願いいたします。

リテシュ

4

0 に答える 0