【问题标题】:What is best way to customize binded text in WPF在 WPF 中自定义绑定文本的最佳方法是什么
【发布时间】:2014-02-28 09:35:28
【问题描述】:

正如标题所说,我需要在WPF中自定义部分文本,例如我有一个短语“The quick brown fox jumps over the lazy dog”,我需要将“brown”这个词加粗,或者改变背景/“狐狸”的前景色。据我所知,常规的 WPF 控件都不支持该功能,是否有任何开源/免费的替代方案?

附:控件应该是可绑定的

谢谢。

【问题讨论】:

    标签: wpf controls


    【解决方案1】:

    我很大程度上取决于您想要完成的任务,但您可以按照建议 here 使用 WPF 工具包的 RichTextBox。

    或者您可以按照here 的建议将绑定功能添加到 .Net RichTextBox。

    但是,如果您不需要像 RichTextBox 这样复杂的东西。您可以使用 ValueConverter 并将要显示的文本更改为更适合您需要的内容。 喜欢这个example

    还取决于您的需要,您可以创建一个用户控件,具有一个依赖属性“文本”,在 PropertyChanged 上,您将文本分成更小的部分,并将它们绑定在不同的“子属性”中将显示在用户控件内的不同文本块(具有不同样式)中。

    更新(添加了我评论中的建议)

    如果 RichTextBox 和 UserControl 都不是解决方案,您可以使用 ValueConverter 通过 TextBlock.Inline 完成此操作,例如 here

    【讨论】:

    • RichTextBox 存在 Unicode 字符问题。它显示 ?
    【解决方案2】:

    您可以使用Run 来装饰您的文字。

        <TextBlock>
            <Run>The quick </Run>
            <Run FontWeight="Bold" Background="Yellow">brown</Run>
            <Run Foreground="Red"> fox </Run>
            <Run>jumps over the lazy dog.</Run>
        </TextBlock>
    

    输出

    此外,如果您使用的是 WPF 4.0 及更高版本,Microsoft 已将 Run 的 Text 属性作为依赖属性而不是普通的 CLR 属性。所以,你也可以绑定它。

    请参阅here 了解可绑定运行。

    【讨论】:

    • 嗯,我可以将文本块绑定到字符串数组(单词?)以根据需要生成尽可能多的 Run 吗?
    • Run 被添加为 Inlines 到 TextBlock 即你可以这样做 textBox.Inlines.Add(new Run() { Text ="Brown" });。但是Inlines 不是 DP,所以你不能绑定它。但是,您可以在其中使用转换器并将字符串数组绑定与 textBox 一起传递,然后您可以将内联添加到 textBlock。但是 TextBlock 中没有内置支持。或者要么必须继承 TextBlock 说 MyTextBlock 并从中公开 DP,并且可以将添加内联的代码放入 DP 更改中。
    • 谢谢,您的回答让我找到了解决方案。我只是在 VM 中将文本分成 3 个部分并将其绑定到 3 个运行。不是一个干净的解决方案,但它有效。
    【解决方案3】:

    你可以利用HTML来自定义文本..你可以得到一组HTML代码here...

    【讨论】:

    • 你知道任何支持html的控件吗?
    • TextBlock 不支持 HTML 标记...您在另一个控件中混淆了 TextBlock..?
    • &amp;quot; 这是一个 HTML 代码,对。它适用于 TextBlock
    猜你喜欢
    • 2015-12-11
    • 1970-01-01
    • 2022-07-03
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 2013-09-07
    • 2021-02-19
    相关资源
    最近更新 更多