Как программно создать текстовый блок с использованием шрифта Segoe MDL2 в WPF

Я думаю, это должно быть легко, но вместо требуемого значка я получаю кучу квадратных квадратов.

Первоначально я был жестко программировал меню в xaml:

code omitted
<ListBoxItem Name="menuHome" >
<StackPanel Orientation="Horizontal">
    <TextBlock FontFamily="Segoe MDL2 Assets" Text="&#xE10F;" FontSize="16" VerticalAlignment="Center" />
    <TextBlock Text="Home" FontSize="16" VerticalAlignment="Center" Padding="15,0,0,0"/>
</StackPanel>
</ListBoxItem>
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 = "&#xE10F;" });
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, который можно увидеть на скриншоте ниже:

screenshot

Любые идеи - возможно, простые...?

Ответ 1

&#xE10F; - объект XML-символа. В исходном XAML он, естественно, разбирался с помощью синтаксического анализатора XML, который, играя по правилам синтаксического анализа XML, преобразовал эту подстроку в один шестнадцатибитный символ Unicode. К тому времени, когда структура создала элемент управления TextBlock, &#xE10F; уже давно преобразован в один символ Unicode.

Но теперь у вас есть этот код на С#. Эта строка анализируется парсером С#, правила которого называют совершенно обычной строкой из восьми символов Unicode.

Text = "&#xE10F;"

Вы передаете ему восемь символов, которые может иметь только синтаксический анализатор XML, но в этом нет никакого парсера XML. Элемент управления отображает эти восемь символов в выбранном вами шрифте, и бывает, что шрифт не имеет глифов для них, поэтому он отображает восемь пустых ящиков.

С# имеет эквивалентную нотацию для указания символов Unicode в строковом литерале. Вместо префикса &#x и ';' postfix, вы просто префикс четырехзначного шестнадцатеричного символьного кода \x. Один и тот же шестнадцатеричный код, но другой способ рассказать об этом конкретном парсере (ну, технически, лексер - но пусть не идет туда сейчас), что эти четыре шестнадцатеричных символа означают что-то особенное.

Поэтому попробуйте это вместо:

Text = "\xE10F" 

Но любой из них тоже сработает; С# имеет больше способов выражения целых чисел за пределами строкового литерала:

Text = Char.ConvertFromUtf32(0xE10F);

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