如何在资源字典中使文本的一部分加粗

时间:2019-02-07 10:42:19

标签: .net wpf xaml

我在资源字典中将字符串定义为

<x:String x:Key="MyString">This is a resource</x:String>

在我的xaml中。

我在TextBlock中使用此字符串。

有没有办法使我做到这一点呢?

<TextBlock Text="{StaticResource MyString}"/>

我不能使用Run,因为此字符串将被翻译成另一种语言,例如德语。

2 个答案:

答案 0 :(得分:1)

您可以使用inline document elements为字符串设置样式,例如<Bold><Italic><Underline>甚至<Run>

从您的字符串中跳出special characters

使用Inlines附加属性,该属性会将字符串转换为内联元素。

示例

<TextBlock local:Inlines.Text="{StaticResource MyString}"/>

MyString的定义类似

<x:String x:Key="MyString">&lt;Bold&gt;This&lt;/Bold&gt; is a resource</x:String>

结果将是

enter image description here

内联附加属性的完整源代码

public class Inlines
{
    public static readonly DependencyProperty TextProperty = DependencyProperty.RegisterAttached("Text",
        typeof(string), typeof(Inlines), new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.AffectsMeasure, OnTextPropertyChanged));

    public static void SetText(DependencyObject @do, string value)
    {
        @do.SetValue(TextProperty, value);
    }

    public static string GetText(DependencyObject @do)
    {
        return (string)@do.GetValue(TextProperty);
    }

    private static void OnTextPropertyChanged(DependencyObject @do, DependencyPropertyChangedEventArgs e)
    {
        var textBlock = @do as TextBlock;

        if (textBlock == null)
        {
            throw new InvalidOperationException("This property may only be set on TextBox");
        }

        var value = GetText(@do);

        var text = "<Span xml:space=\"preserve\" xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\">" +
             $"{value ?? string.Empty}</Span>";

        textBlock.Inlines.Clear();

        using (var xmlReader = XmlReader.Create(new StringReader(text)))
        {
            var result = (Span)XamlReader.Load(xmlReader);
            textBlock.Inlines.Add(result);
        }
    }
}

答案 1 :(得分:0)

字符串只是一系列字符-它们没有任何格式,这是一种显示属性。

如果要将文本的一部分显示为粗体,最简单的方法是将其分为两部分,然后将它们绑定到Run中单独的TextBlock元素中。不过,这可能会导致翻译成其他语言时出现问题,因为单词顺序可能会有所不同。

另一种方法是在文本字符串中包含某种格式代码,并使用控件将其解释为所需的显示特征。使用HTML并在窗口中添加Web浏览器控件似乎只是为了显示一些格式化的文本而已。但是,我确实写过有关这种控件的信息,它是一个扩展的文本块,可以在最近的blog post中识别出文本字符串内的HTML标签的伪子集。