1

rtfでテキストブロックを設定しようとすると、面白い出力が得られますが、テキストブロックにrtfを表示する方法はありますか?

private void button1_Click(object sender, RoutedEventArgs e)
{
    TextRange tr = new TextRange(richTextBox1.Document.ContentStart,
                     richTextBox1.Document.ContentEnd);
    MemoryStream ms = new MemoryStream();
    tr.Save(ms, DataFormats.Rtf); 
    string rtfText = ASCIIEncoding.Default.GetString(ms.ToArray());
    textBlock1.Text = rtfText;

更新を編集:

私がすることができます:

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        TextRange tr = new TextRange(richTextBox1.Document.ContentStart,
             richTextBox1.Document.ContentEnd);
        MemoryStream ms = new MemoryStream();
        tr.Save(ms, DataFormats.Rtf); // does not contain a definition
        string rtfText = ASCIIEncoding.Default.GetString(ms.ToArray());
        MemoryStream stream = new MemoryStream(ASCIIEncoding.Default.GetBytes(rtfText));
           this.richTextBox2.Selection.Load(stream, DataFormats.Rtf);

しかし、リッチテキストの書式設定を保持できる他のコントロールはありませんか? または、特定のコントロールに rtf を表示するように指示する方法はありますか?

4

4 に答える 4

2

TextBlockを使用してRTFテキストを表示することはできません。ただし、 FlowDocumentScrollViewerにテキストを表示しても問題がない場合は、次のようにコピーできます。

public MainWindow()
{
    InitializeComponent();

    richTextBox.Document = new FlowDocument();
    flowDocumentScrollViewer.Document = new FlowDocument();
}

private void CopyDocument(FlowDocument source, FlowDocument target)
{
    TextRange sourceRange = new TextRange(source.ContentStart, source.ContentEnd);
    MemoryStream stream = new MemoryStream();
    XamlWriter.Save(sourceRange, stream);
    sourceRange.Save(stream, DataFormats.XamlPackage);
    TextRange targetRange = new TextRange(target.ContentStart, target.ContentEnd);
    targetRange.Load(stream, DataFormats.XamlPackage);
}

private void Button_Click(object sender, RoutedEventArgs e)
{
    CopyDocument(richTextBox.Document, flowDocumentScrollViewer.Document);
}

ここでフロードキュメントの概要を取得します。

于 2012-04-20T21:49:56.650 に答える
1

これにより、FlowDocument全体が提供されますが、マークアップが含まれているのは良いニュースです。それがあなたが探しているものだと思います

string textMarkUp = System.Windows.Markup.XamlWriter.Save(richTextBox1.Document);
Debug.WriteLine(textMarkUp); 

サンプル出力

<Paragraph>asdfas<Run FontWeight="Bold">adsfasd;lkasdf</Run><Run FontStyle="Italic" FontWeight="Bold">alskjfd</Run></Paragraph>
于 2012-04-20T21:47:29.637 に答える
0

RichTextBox は変換のためだけに使用され、最終的なコントロールは FlowDocumentScrollViewer であるため、わずかに単純化された関数になりました。

public static class FlowDocumentScrollViewerEx
{
    static public bool ReadFromFile(this FlowDocumentScrollViewer fDoc, String rtfFilePath)
    {
        RichTextBox retext = new RichTextBox();     // Just an intermediate class to perform conversion
        retext.Document = new FlowDocument();
        fDoc.Document = new FlowDocument();

        TextRange tr = new TextRange(retext.Document.ContentStart, retext.Document.ContentEnd);

        if (!File.Exists(rtfFilePath))
            return false;

        using (var fs = new FileStream(rtfFilePath, FileMode.OpenOrCreate))
        {
            tr.Load(fs, DataFormats.Rtf);
            fs.Close();
        }

        MemoryStream ms = new MemoryStream();
        System.Windows.Markup.XamlWriter.Save(retext, ms);
        tr.Save(ms, DataFormats.XamlPackage);
        TextRange flowDocRange = new TextRange(fDoc.Document.ContentStart, fDoc.Document.ContentEnd);
        flowDocRange.Load(ms, DataFormats.XamlPackage);
        return true;
    } //ReadFromFile
} //class FlowDocumentScrollViewerEx

使い方はとても簡単です:

flowDocument.ReadFromFile(@"license.rtf");
于 2016-05-09T08:45:16.027 に答える