WPF 中动态 TextBlock 内容的选择性着色

发布于 2024-08-30 08:39:27 字数 477 浏览 3 评论 0原文

对于静态内容的选择性着色,以下建议效果很好: 是否可以选择性地为包装材料着色Silverlight/WPF 中的 TextBlock

但是我的内容将在运行时生成。 对于前。如果生成的内容是:“A Quick Brown Fox” 然后我需要它们将“Brown”串为棕色,将“Fox”串为红色。

关键字颜色列表是固定的,并且在运行时可供我使用。

我已经查看了 MSDN 上的 Advanced TextFormatting 页面,但它对我来说太复杂了,而且其中的示例也无法编译:(

我正在考虑创建一个可以为我执行此操作的自定义控件。如果有人有,请告诉我关于如何进行此操作的任何想法,

请提前致谢。

For selective coloring of static content the following suggestion works fine :
Is it possible to seletively color a wrapping TextBlock in Silverlight/WPF

However my content will be generated at runtime.
For ex. if the Content generated is : "A Quick Brown Fox"
Then I need they string "Brown" to be in color Brown and "Fox" to be in color Red

The Keyword-Color list is fixed and available to me at runtime.

I have looked at the Advanced TextFormatting page on MSDN, but it is too complicated for me, also the sample in there does not compile :(

I am looking at creating a custom control which can do this for me. Let me know if anyone has any idea regarding how to go about this.

Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

柠北森屋 2024-09-06 08:39:27

这个想法在您的链接中进行了解释:在自定义控件中拥有文本的属性。然后扫描文本中的单词,并创建适当的运行。最后,将它们全部分配给 TextBox inlines 集合。

在这个例子中,我简单地使用了 string.Split()。如果单词被其他标点符号分割,您可能会漏掉单词。

Dictionary<string, Brush> colorDictionary;
string text;  // The value of your control's text property

string[] splitText = text.Split(' ', ',', ';', '-');
foreach (string word in splitText)
{
    if (string.IsNullOrEmpty(word))
    {
        continue;
    }

    Brush runColor;
    bool success = colorDictionary.TryGetValue(word, out runColor);
    if (success)
    {
        Run run = new Run(word);
        run.Background = runColor;
        textbox.Inlines.Add(run);
    }
    else
    {
        Run run = new Run(word);
        texbox.Inlines.Add(run);
    }
}

The idea is explained in your link: Have a property for the text in the custom control. Then scan the text for the words, and create appropriate Runs. In the end, assign them all to the TextBox inlines collection.

In this example I simply used string.Split(). You might miss words if they are split by other punctuation.

Dictionary<string, Brush> colorDictionary;
string text;  // The value of your control's text property

string[] splitText = text.Split(' ', ',', ';', '-');
foreach (string word in splitText)
{
    if (string.IsNullOrEmpty(word))
    {
        continue;
    }

    Brush runColor;
    bool success = colorDictionary.TryGetValue(word, out runColor);
    if (success)
    {
        Run run = new Run(word);
        run.Background = runColor;
        textbox.Inlines.Add(run);
    }
    else
    {
        Run run = new Run(word);
        texbox.Inlines.Add(run);
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文