如何使用WPF中的Segoe MDL2 Assets字体以编程方式创建文本块

我想这应该很容易,但我得到了一堆方盒而不是我需要的图标。

最初我在xaml中编写了一个菜单:

code omitted       code omitted 

我现在必须动态创建此菜单,所以我有以下内容:

 ListBoxItem menuHome = new ListBoxItem(); StackPanel menuHomeStackPanel = new StackPanel() { Orientation = Orientation.Horizontal }; menuHomeStackPanel.Children.Add(new TextBlock() { FontFamily = new FontFamily("Segoe MDL2 Assets"), FontSize = 16, VerticalAlignment = VerticalAlignment.Center, Text = "" }); menuHomeStackPanel.Children.Add(new TextBlock() { FontSize = 16, VerticalAlignment = VerticalAlignment.Center, Text = "Home", Padding = new Thickness(15, 0, 0, 0) }); menuHome.Content = menuHomeStackPanel; menuHome.Name = "menuHome"; IconsListBox.Items.Add(menuHome); 

除了Segoe MDL2 Assets字体之外,这几乎与我相同,可以在下面的屏幕截图中看到:

截图

任何想法 – 可能很简单……?

是一个XML字符实体。 在您的原始XAML中,它自然地由XML解析器解析,XML解析器通过XML解析规则将子字符串转换为单个16位Unicode字符。 当框架创建TextBlock控件时, 早已转换为单个Unicode字符。

但是现在你已经有了这个C#代码。 该字符串由C#解析器解析,其规则称为完全普通的8个 Unicode字符串。

 Text = "" 

你传递了八个字符的东西,只有XML解析器可以理解 – 但是不再涉及XML解析器。 控件在您选择的字体中显示这八个字符,并且字体没有字形,因此它显示八个空框。

C#具有在字符串文字中指定Unicode字符的等效表示法 。 而不是&#x前缀和’;’ postfix,你只需要用\x前缀一个四位hex字符代码。 相同的hex代码,但是告诉这个特定解析器的一种不同方式(从技术上讲,词法分析器 – 但是现在不要去那里)这四个hex字符意味着特殊的东西。

所以试试这个:

 Text = "\xE10F" 

但这些中的任何一个都可以起作用; C#有更多的方法来表示字符串文字之外的整数:

 Text = Char.ConvertFromUtf32(0xE10F); // Same value, in base 10 Text = Char.ConvertFromUtf32(57615);