10

私は、ユーザーがRichTextBox現在のキャレット位置にあるテキストを別の場所に挿入できるようにする必要があるアプリケーションを構築しています。この手法に出くわす前に、のオブジェクトモデルをいじくり回すのに多くの時間を費やしましたが、どちらも次のようになります。FlowDocumentsourcetargetFlowDocument

using (MemoryStream ms = new MemoryStream())
{
    TextRange tr = new TextRange(source.ContentStart, source.ContentEnd);                    
    tr.Save(ms, DataFormats.Xaml);
    ms.Seek(0, SeekOrigin.Begin);
    tr = new TextRange(target.CaretPosition, target.CaretPosition);
    tr.Load(ms, DataFormats.Xaml);
}

これは非常にうまく機能します。

私が今抱えている唯一の問題は、常にソースを新しい段落として挿入することです。カレットで現在の実行(またはその他)を中断し、ソースを挿入して、段落を終了します。これは、ソースが実際に1段落(または複数の段落)である場合は適切です、(たとえば)1行のテキストである場合は適切ではありません。

これに対する答えは、ターゲットが完全に単一のブロックで構成されているかどうかを確認し、そうである場合はTextRange、ブロックのコンテンツの最初と最後を指すように設定してから保存することになる可能性が高いと思います。ストリームに。

の全世界はFlowDocument私にとって暗い謎のうねる海です。必要に応じて私はそれの専門家になることができます(ドストエフスキーによると:「人は何にでも慣れることができる動物です。」)が、誰かがすでにこれを理解していて、これを行う方法を教えてくれるなら、それは私の人生ははるかに簡単です。

4

1 に答える 1

14

差し迫った問題は、TextFormat.Xamlの代わりにを使用していることですTextFormat.XamlPackage

ドキュメントを結合するときに行を結合するかどうかを制御するプロパティがSection.HasTrailingParagraphBreakOnPasteプロパティです。このプロパティは、テキスト形式をロードまたは保存する場合にのみ有効です。XamlPackage代わりにテキスト形式を使用する場合Xaml、プロパティはの間は省略され、の間はSave()無視されLoad()ます。

したがって、簡単な修正は、Load呼び出しとSave呼び出しを変更することです。

tr.Save(ms, DataFormats.XamlPackage); 
ms.Seek(0, SeekOrigin.Begin); 
tr = new TextRange(target.CaretPosition, target.CaretPosition); 
tr.Load(ms, DataFormats.XamlPackage); 

これにより、最終的に発生する別の問題も修正されることに注意してくださいDataFormats.Xaml。画像ビットを配置する場所がないため、使用時に埋め込みビットマップが正しくコピーされません。DataFormats.XamlPackageパッケージ全体が構築されているので、ビットマップやその他のパッケージアイテムは問題なく検出されます。

この変更を行うと、問題になる場合と問題にならない場合がある別の事実が見つかる場合があります。サンプルコードではとを使用document.ContentStartしてdocument.ContentEndいます。これが実際のコードである場合、からdocument.ContentStartまでの範囲document.ContentEndは必ず完全な段落で構成されていることがわかります。したがって、それをコピーすると、挿入の最後に常に段落区切りが挿入されます。これが問題になる場合は、次のようなものを使用するかRichTextBox.Selection(UI駆動の場合)、暗黙の段落マークの前にTextPointerバックアップするために使用します。次に例を示します。ContentEnd

var tr = new TextRange(document.ContentStart,
                       document.ContentEnd.GetInsertionPosition(
                                                  LogicalDirection.Backward));
于 2010-03-24T04:46:11.677 に答える