2

WPFFlowDocumentは、単一の にのみ属することができRichTextBoxます。ただし、UI のさまざまなポイント (空間と時間) で操作できる単一のドキュメントを使用したいと考えています。RichTextBoxes2 つのドキュメントが 1 つのドキュメントを同時に表示することは決してありません(WPF が文句を言うので、それはできません)。

MemoryStreamここではand XamlReader/を使用するWriterことはできません。単一のドキュメントを保持し、それが使用される場所に変更を反映させたいため、毎回コピーすることはできません。

それを達成するための他の実行可能な方法はありますか?s などを作成するための基になるモデルとして使用できるものはありますFlowDocumentか?

明確化: Document を使用する RichTextBoxes は、別のものがインスタンス化されると、もはや表示されないか、論理/ビジュアル ツリーのどこにもありません。おそらく、それらがすでにGCに食べられていることを強制することはできませんが. これにより、RichTextBox をウィンドウから削除した直後に Document を再利用すると問題が発生するようです。Document が別のコントロールで既に使用されているという例外がスローされます。

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

4

4 に答える 4

4

FlowDocument は、複数の RichTextBox コントロールで直接共有することはできません。

したがって、最初にそのドキュメントを「切り離す」必要があります...

そう

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;
    }
}

それは本の中で最もきれいではありませんが、うまくいきます...

お役に立てれば..

于 2009-04-16T08:09:29.140 に答える
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

于 2009-04-15T16:11:50.427 に答える
0

任意の時点で 1 つのエディターしかインターフェイスに表示されない場合、アクティブなエディターの LostFocus イベントですべてのエディターのコンテンツを同期できると考えるべきです。

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

編集:ウィザードでページ間を移動するときに XamlWriter.Save / XamlReader.Parse シーケンスを実行できない理由が理解できないと思いますが、同じ RichTextBox インスタンスを常に使用して、それを再親化するのはどうですか?そのページが表示/アクティブになったときの各ページのコンテナ?

于 2009-04-08T14:01:29.870 に答える
0

フロー ドキュメントは共有できないため、デタッチする必要があります。

string flowDocument = XamlWriter.Save(RTF1.Document);
RichTextBox RTF2= new RichTextBox();
RTF2.Document = XamlReader.Load(new MemoryStream(Encoding.Default.GetBytes(flowDocument))) as FlowDocument; 
于 2015-05-13T03:48:04.400 に答える