我在资源字典中将字符串定义为
<x:String x:Key="MyString">This is a resource</x:String>
在我的xaml中。
我在TextBlock中使用此字符串。
有没有办法使我做到这一点呢?
<TextBlock Text="{StaticResource MyString}"/>
我不能使用Run,因为此字符串将被翻译成另一种语言,例如德语。
答案 0 :(得分:1)
您可以使用inline document elements
为字符串设置样式,例如<Bold>
,<Italic>
,<Underline>
甚至<Run>
。
从您的字符串中跳出special characters
。
使用Inlines
附加属性,该属性会将字符串转换为内联元素。
示例
<TextBlock local:Inlines.Text="{StaticResource MyString}"/>
MyString的定义类似
<x:String x:Key="MyString"><Bold>This</Bold> is a resource</x:String>
结果将是
内联附加属性的完整源代码
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标签的伪子集。