2016-01-11 10 views
10

erstellen Ich denke, das sollte einfach sein, aber anstelle des Symbols, das ich benötige, bekomme ich eine Reihe von quadratischen Kästchen.Wie programmgesteuert Textblock mit Segoe MDL2 Assets Schrift in WPF

Ursprünglich war ich hart Codierung ein Menü in 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 

Ich muss jetzt dynamisch dieses Menü erstellen, so habe ich die folgenden:

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); 

Das gibt mir fast die gleiche, außer für die Schriftart Segoe MDL2 Assets, die in der folgenden Abbildung zu sehen ist:

screenshot

Irgendwelche Ideen - wahrscheinlich einfach ...?

+1

Für VB.net sollte Text verwenden = ChrW ("& HE10F") – Nitin

Antwort

26

&#xE10F; ist eine XML-Zeichenentität. In Ihrem ursprünglichen XAML wurde es natürlich von einem XML-Parser analysiert, der diese Teilzeichenfolge mit Hilfe von XML-Parserregeln in ein einzelnes 16-Bit-Unicode-Zeichen umwandelte. Als das Framework das Steuerelement TextBlock erstellte, wurde &#xE10F; längst in ein einzelnes Unicode-Zeichen konvertiert.

Aber jetzt haben Sie diesen C# -Code. Diese Zeichenfolge wird vom C# -Parser analysiert, dessen Regeln eine vollkommen gewöhnliche Zeichenkette von acht Unicode-Zeichen aufrufen.

Text = "&#xE10F;" 

Sie vorbei es acht Zeichen von Sachen nur ein XML-Parser keinen Sinn machen kann - aber es gibt keinen XML-Parser nicht mehr beteiligt. Das Steuerelement zeigt diese acht Zeichen in der von Ihnen gewählten Schriftart an, und die Schriftart enthält keine Glyphen. Daher werden acht leere Felder angezeigt.

C# hat an equivalent notation for specifying Unicode characters in a string literal. Anstelle des Präfixes &#x und des ';' Postfix, setzen Sie einfach einen vierstelligen Hexadezimalcode mit \x voran. Derselbe Hex-Code, aber eine andere Art, diesen Parser zu sagen (naja, technisch gesehen, der Lexer - aber lass uns jetzt nicht einfach hingehen), dass diese vier Hex-Zeichen etwas besonderes bedeuten.

Also versuchen Sie stattdessen:

Text = "\xE10F" 

Aber entweder von diesen funktionieren würde; C# hat mehr Möglichkeiten, ganze Zahlen wörtliche außerhalb einer Zeichenkette auszudrücken:

Text = Char.ConvertFromUtf32(0xE10F); 

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

arbeitete wie ein Charme - danke. Was macht das? - Sagen "Dies ist ein Zeichen und kein String-Literal"? – Rick

+2

@Rick '\ x' ist das Präfix, das in C# -Stringliteralen verwendet wird, um anzuzeigen, dass die nächsten vier Zeichen ein Hexadezimalzeichen sind. Es ist ein exaktes Äquivalent der XML- & # xE10F; -Notation. –

+0

Cool danke - immer noch kleine Leckerbissen wie diese aufheben. – Rick

Verwandte Themen