2009-04-08 21 views
2

WPF FlowDocumentは、単一のRichTextBoxにのみ属することができます。しかし、私たちは、UI内の異なる場所(時空間および時間内)で操作できる単一の文書を使用したいと考えています。 RichTextBoxesが同時に1つのドキュメントを表示することはありません(WPFは文句を言うのでできません)。複数のリッチテキストボックス間のフロードキュメントの共有

MemoryStreamXamlReader/Writerを使用すると、1つのドキュメントを保持して、変更が反映されるたびに変更を反映したいので、ここでは機能しません。

これを達成する他の実行可能な方法はありますか? FlowDocument秒を作成する基礎となるモデルとして使用できるものは何ですか?

説明:ドキュメントを使用するリッチテキストボックスは、別のものがインスタンス化されるとき、もはや表示されなくなります。おそらく私は彼らがすでにGCによって食べられたことを強制することはできません。これは、ウィンドウからRichTextBoxを削除した直後にドキュメントを再利用すると問題が発生しているようです。 Documentはすでに別のコントロールで使用されているという例外をスローします。

基本的に、一連の「ウィザードページ」が次々に表示され、2つの連続する「ページ」でドキュメントを再利用しながら毎回新しいRTBoxをインスタンス化することがあります。たぶん、問題や良い方法がありますか?

答えて

0

ウィザードの作成方法によっては、実際にはとなります。では、RichTextBoxをページ間で移動することをお勧めします。 WPFコントロールは自由に「親なし」と「元に戻す」ことができるので、ウィザード全体で共有されているコンテキストでRichTextBoxインスタンスを利用できるようにし、ページ間を移動するときに親/改竄を確認してください。これには、ウィザード内のページ全体にわたるエディタ状態のスタイルや変更を保存する利点もあります(これはおそらく望ましいことです)。

ページ全体でRichTextBoxインスタンスを共有できない場合は、ドキュメントを元のRichTextBoxから切り離す方法があると思います。 RichTextBox1からドキュメントの関連付けを解除するには、RichTextBox1に新しいドキュメントを提供する必要があります。 RichTextBox1.Documentをnullに設定することはできませんが、RichTextBox1.Documentを新しいFlowDocument()に設定することはできますが、それはうまくいくと思います。私は今、この権利をテストすることができないんだけど、私はそれは、このMSDNのフォーラムのスレッドの最後のポストに推奨されていた見た:

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/797bfc96-cf24-4071-bff8-ce8c4a7b897b

0

ある時点でインターフェイスに表示できるエディタが1つだけの場合は、アクティブエディタのLostFocusイベントのすべてのエディタの内容を同期させることができます。

アプリケーションの現在表示されている別の部分に変更を反映させる必要がある場合は、矩形を使用して偽装することができます。たとえば、Fillはアクティブエディタを参照するVisualBrushで、Rectangleの幅と高さエディタの実際の幅と高さにバインドされました。トリッキーな部分は、アクティブなエディタスイッチを比較的シームレスに処理することです。

編集:私は同じリッチテキストボックスのインスタンスのすべての時間を使用することについて...何をウィザード内のページ間を移動するXamlWriter.Save/XamlReader.Parseシーケンスを行うことができない理由を私は理解していないと思いますが、そのページが表示/アクティブになると、各ページのコンテナにその親を再表示しますか?

+0

私は質問にもう少し詳しく説明。私たちは、deefinitelyすぐに別の場所UIでそれらの変更を反映する必要はありません。 XamlWriter/Readerで静的コンテンツを回避することはできますが、動的なものは回避できません。( – Joey

4

FlowDocumentは直接、いくつかのリッチテキストボックスコントロールで共有することはできません。..

は、だから、だから、

RTB2.Document = RTB1.Document; 

文句を言わない仕事と自分の例外が発生します。..

FlowDocument doc = RTB1.Document; 
RTB1.Document = new FlowDocument(); //Document cannot be null, so therefor the new FlowDocument instance 
RTB2.Document = doc; 

が同じように動作します

...最初にその文書を '切り離す' する必要があります魅力...

マイコードサンプル:

XAML:背後

<Window x:Class="WpfApplication2.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 

    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 

     <Grid.RowDefinitions> 
      <RowDefinition /> 
      <RowDefinition Height="Auto" /> 
     </Grid.RowDefinitions> 


     <RichTextBox x:Name="RTB1" /> 

     <RichTextBox x:Name="RTB2" Grid.Column="1" /> 

     <Button x:Name="button" Grid.Row="1" Grid.ColumnSpan="2" Content="click" Click="button_Click" /> 

    </Grid> 

</Window> 

コード..

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
    } 

    private void button_Click(object sender, RoutedEventArgs e) 
    { 
     FlowDocument doc = RTB1.Document; 
     RTB1.Document = new FlowDocument(); 
     RTB2.Document = doc; 
    } 
} 

そのないブックで最も美しいが、それはこのことができます...

希望に動作します。..

+1

私はこのコードを使用していて、それは驚きました。 'Private Sub TradeTextBoxDocument(ByRefリッチテキストボックス、リッチテキストボックスとしてのByRef先)として 点心の流れとしてソースFlowDocument = source.Document source.Document =新FlowDocument destination.Document =、それがシリアライズとデシリアライズだが。私が支配していることに注意してください切り離していない End Subの」 – DoomVroom

0

フローあなたがデタッチする必要がありますので文書が共有することはできません。

string flowDocument = XamlWriter.Save(RTF1.Document); 
RichTextBox RTF2= new RichTextBox(); 
RTF2.Document = XamlReader.Load(new MemoryStream(Encoding.Default.GetBytes(flowDocument))) as FlowDocument; 
+0

流れ問題のこのアプローチアウト(約6年前)。 – Joey

関連する問題