在richtextbox中为FlowDocument应用从字符串到文本的文本格式

时间:2017-03-24 15:51:01

标签: xaml

我知道在XAML中添加text / content / DataContext时,您可以参考资源字典或内联标记,以便在文本或模板中进行样式设置。

问: 但是,我在尝试寻找以下方法时遇到了麻烦:

数据来自从数据库中提取的视图模型/模型。

(字符串值) I am a <Bold>smart</Bold> man.

在这样的流程文档中显示:

我是智能男人。

Q end

通过绑定到转换器,行为,还是将我放在流文档中的段落/文档保存到内存流中的.rtf文件是更好的选择?

我已尝试使用列出的行为选项&gt; here&lt;但这适用于文本块,无法重定向类型文本而不是文本块。

试图简化它。

尝试使用数据绑定并应用转换器,但即使我有行为/转换器的资源,它也可以通过类型转换工作。

2 个答案:

答案 0 :(得分:0)

Rockford Lhotka在帖子Set rich text into RichTextBlock control中提出了一个聪明的解决方案。他的想法是创建一个自定义控件,然后使用XamlReader.Load创建RichTextBlock。

这允许您使用如下代码:

    <local:RichTextDisplay Xaml="{Binding Hello}" HorizontalAlignment="Center" 
                           VerticalAlignment="Center"/>

Hello是:

    public string Hello { get; set; } = "I am a <Bold>smart</Bold> man.";

结果:

Output xaml bold RichTextBlock

如果您使用UWP / Win 8.1 XAML,您可以使用博客文章中的原始代码进行以下小改动(添加了段落):

<UserControl 
  xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" 
  xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"" 
  xmlns:mc=""http://schemas.openxmlformats.org/markup-compatibility/2006""> 
  <Grid> 
    <RichTextBlock><Paragraph>");
            xaml.Append(ctl.Xaml);
            xaml.Append(@" 
    </Paragraph></RichTextBlock> 
  </Grid> 
</UserControl> 
");

答案 1 :(得分:0)

回答我自己的问题: 我的情况是创建一个文档样式显示,供用户更新并另存为PDF,但我并不想依赖Office在我们的应用服务器上。

所以我通过使用完整的&#34; doc.RTF&#34;来解决这个问题。记录并将其作为内存流/字符串导入,并将值所需的更新应用于该文件。

即。 VB.net代码段示例

Using uStream = Assembly.GetExecutingAssembly.GetManifestResourceStream("Resourcefilepath.rtf") 
    Using mStream As system.IO.MemoeryStream = New MemoryStream()
        uStream.CopyTo(mStream)
        rtfstring = Encoding.UTF8.GetSTring(mStream.toArray())
        '--Do the updates to the needed string as needed:
        rtfstring.Replace("Value","UpdatedValue")
        '--Load Property Memory String this method is returnind  
        RTFDataProperty = New MemoryStream(Encoding.UTF8.GetBytes(rtfstring))
    End Using
End Using

然后我将带有该内存流的XAML Rich Text Box加载为DataFormats.Rtf。

RichTextBox1.SelectAll()
RichTextBox1.Selection.Load(ClassName.RTFDataProperty, DataFormats.Rtf)

这为我提供了该文档格式和布局的模板。 (更多案例场景而非正常做法)

我也想申请一个首发选择,所以这就是我在那里所做的:

'--Get my RichTextBox Text
rtbtext As String = New TextRange(RichTextBox1.Document.contentStart, RichTextbox1.Document.ContentEnd).Text
Dim strStartSelection As String = "Comments..."
Dim startTP As TextPointer
Dim endTP As TextPointer

'--Loop through the paragraphs of the richtextbox for my needed selection starting point:
For Each para As Paragraph In RichTextBox1.Document.Blocks
    Dim paraText As String = New TextRange(para.ContentStart, para.ContentEnd).Text
    If paraText = "" Then
        Dim pos As TextPointer = para.ContentStart
        startTP = pos
        endTP = startTP.GetPositionAtOffset("".Length + 3) '--my string had ... on the end so had to add for avoiding the escape of that on length
        RichTextBox1.Selection.Select(startTP, endTP)
        RichTextBox1.Focus()
        Exit For
    End If
Next

这是一个简单的VB.net代码布局,但如果你发现它有用,你可以从那里进行简化和调整。

由于