2.1.4.8
Auf die aktuelle Culture eingehen
Die WPF biete diverse sinnvolle Mechanismen um z.b. den Text in einer TextBox so darzustellen wie dies der aktuelle Anwendungsfall erfordert.
Das StringFormat beim Binding ist hier ein sehr gutes Beispiel welches wir bereits unter anderem in Kapitel 2.1.4.7 verwendet hatten.
Aber wie sieht es eigentlich aus mit der Kultur? Kann ich das selbst steuern? Was ist der Default wert bei einer WPF Anwendung? Wie kann ich steuern ob wie ein Datum angezeigt wird oder welches Währungssymbol hinter einem Betrag steht? Das sind Fragen auf welche wir heute eingehen werden.
Erstmal sein gesagt das die WPF per Default von
Um dies zu demonstrieren habe ich mal ein Window erstellt welches dies demonstriert.
Wie man gut erkennen kann wird sowohl für den Geburtstag als auch für das Guthaben der Personen die amerikanische Kultur verwendet. Bis hin zum Dollar-Zeichen.
Das kann auch zu Problemen führen. Wenn wir und die TextBox für das Guthaben unten genauer ansehen sehen wir das hier das „Tausender-Trennzeichen“ ein Komma ist und das Komma ein Punkt.
Viele gehen nun her und verwenden schlicht statt dem StringFormat
Gibt der User nun einen Betrag wie 1493,67 ein wird die WPF in diesem Fall nämlich 149367 als Wert zurückspeichern. Fatal! Man müsste nämlich 1494.67 eingeben.
Also ist es wichtig dass wir die richtige Kultur (Culture) verwenden. Ob man nun die Culture des Windows Benutzers mittels
Am besten setzt man die Kultur in der
Möchte man nicht die Systemkultur verwenden dann kann die erste Zeile wie folgt ersetzt werden:
So könnte in den Programmeinstellungen der String für die Kultur hinterlegt werden.
Hier ein kleiner Einblick was in der Culture so hinterlegt ist:
Wie wir sehen geht es bei der Kultur nicht einfach nur um die Sprache, sondern auch um Tastaturlayouts, Kalender, Nummernformate usw.!
Es gibt auch Sprachen welche man von rechts nach links liest wie z.b. Arabisch.
OK, sehen wir uns mal an wie dies aussieht wenn wir die aktuelle Systemsprache auf das oben bereits gezeigt Fenster anwenden indem wir im
Das sieht schon besser aus. Wir haben sowohl das Deutsche Datumsformat als auch das Euro-Symbol und das korrekte Trennzeichen.
Geben wird nun einen Betrag mit einem Komma wie 1657,47 ein wird der Wert nun auch korrekt gespeichert.
Converter
Als nächstes sehen wir uns an wie dies mit Convertern aussieht. Converter haben wir ja bereits in Kapitel 2.1.4.4 kennengelernt. Nun sehen wir uns an wie wir innerhalb eines Converters auf die aktuelle Kultur eingehen.
Hierfür erstellen wir einen Konverter mit dem Namen „TestConverter“. Dieser konvertiert im Moment nichts. Er soll uns nur dazu dienen zu sehen welche Culture wir in einem Converter hineingereicht bekommen.
Wir lassen uns hier schlicht das aktuelle Währungssymbol in die Konsole ausgeben um anschließend einfach den
Der Konverter gibt folgenden Text in die Konsole aus:
Wir sehen also dass hier auch die Systemkultur mit übergeben wird und könnten nun darauf reagieren um Beispielsweise Umwandlungen zu vollziehen.
Fazit: Die WPF nimmt per Default immer
Dies muss vom Entwickler überschrieben werden da sonst immer und überall das amerikanische Format verwendet wird.
Dies ist wie wir gesehen haben auch sehr wichtig da es ansonsten zu sehr unangenehmen Nebeneffekten kommen kann welche oft gerne mal länger unentdeckt bleiben.
Natürlich erkläre ich dies alles auch wieder interaktiv in einem Video wo ihr besser sehen könnt wie jeder Schritt funktioniert.
Ich freue mich auch über jedes Like oder ein Kommentar im Video oder dem Kanal.
Hier die Solution: 2_1_4_8_Culture.zip
Und wie immer auch das PDF für euer E-Book: Tutorialreihe WPF lernen 2_1_4_8.pdf
Ich freue mich wie immer über Kommentare, Kritik und Vorschläge sowie natürlich auch likes/hilfreich.
Entweder im Supportthread oder auf meinem YouTube Kanal.
Grüße
Sascha
Auf die aktuelle Culture eingehen
Die WPF biete diverse sinnvolle Mechanismen um z.b. den Text in einer TextBox so darzustellen wie dies der aktuelle Anwendungsfall erfordert.
Das StringFormat beim Binding ist hier ein sehr gutes Beispiel welches wir bereits unter anderem in Kapitel 2.1.4.7 verwendet hatten.
Aber wie sieht es eigentlich aus mit der Kultur? Kann ich das selbst steuern? Was ist der Default wert bei einer WPF Anwendung? Wie kann ich steuern ob wie ein Datum angezeigt wird oder welches Währungssymbol hinter einem Betrag steht? Das sind Fragen auf welche wir heute eingehen werden.
Erstmal sein gesagt das die WPF per Default von
en-US
als Kultureinstellung ausgeht. Das bedeutet dass in allen Controls (DataGrid, TextBox, Label usw.) das amerikanische Format verwendet wird. Um dies zu demonstrieren habe ich mal ein Window erstellt welches dies demonstriert.
XML-Quellcode
- <Window x:Class="MainWindow"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- mc:Ignorable="d"
- Title="MainWindow" Height="450" Width="800">
- <DockPanel LastChildFill="True">
- <Border BorderThickness="2" BorderBrush="Black" DockPanel.Dock="Bottom">
- <StackPanel DataContext="{Binding SelectedPerson}">
- <TextBox Text="{Binding Firstname}"/>
- <TextBox Text="{Binding Lastname}"/>
- <TextBox Text="{Binding Birthday}"/>
- <TextBox Text="{Binding Credit, StringFormat=\{0:C\}}"/>
- </StackPanel>
- </Border>
- <DataGrid ItemsSource="{Binding Persons}" SelectedItem="{Binding SelectedPerson}"/>
- </DockPanel>
- </Window>
Wie man gut erkennen kann wird sowohl für den Geburtstag als auch für das Guthaben der Personen die amerikanische Kultur verwendet. Bis hin zum Dollar-Zeichen.
Das kann auch zu Problemen führen. Wenn wir und die TextBox für das Guthaben unten genauer ansehen sehen wir das hier das „Tausender-Trennzeichen“ ein Komma ist und das Komma ein Punkt.
Viele gehen nun her und verwenden schlicht statt dem StringFormat
\{0:C\
ein eigenes StringFormat und denken dass damit die Sache erledigt ist. Weit gefehlt.Gibt der User nun einen Betrag wie 1493,67 ein wird die WPF in diesem Fall nämlich 149367 als Wert zurückspeichern. Fatal! Man müsste nämlich 1494.67 eingeben.
Also ist es wichtig dass wir die richtige Kultur (Culture) verwenden. Ob man nun die Culture des Windows Benutzers mittels
CultureInfo.CurrentCulture
verwendet oder ob man es den Benutzer aussuchen lässt (Beispielsweise über Einstellungen) bleibt einem hier selbst überlassen.Am besten setzt man die Kultur in der
Application_Startup
Methode, kann allerdings natürlich auch sonst wo gesetzt werden wie Beispielsweise im Window_Loaded
des Startfensters.VB.NET-Quellcode
- Dim currentCulture As CultureInfo = CultureInfo.CurrentCulture Thread.CurrentThread.CurrentCulture = currentCulture Thread.CurrentThread.CurrentUICulture = currentCulture LanguageProperty.OverrideMetadata(GetType(FrameworkElement), New FrameworkPropertyMetadata(
- XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)))
Möchte man nicht die Systemkultur verwenden dann kann die erste Zeile wie folgt ersetzt werden:
So könnte in den Programmeinstellungen der String für die Kultur hinterlegt werden.
Hier ein kleiner Einblick was in der Culture so hinterlegt ist:
Wie wir sehen geht es bei der Kultur nicht einfach nur um die Sprache, sondern auch um Tastaturlayouts, Kalender, Nummernformate usw.!
Es gibt auch Sprachen welche man von rechts nach links liest wie z.b. Arabisch.
OK, sehen wir uns mal an wie dies aussieht wenn wir die aktuelle Systemsprache auf das oben bereits gezeigt Fenster anwenden indem wir im
Window_Loaded
Event die Culture setzen. Das sieht schon besser aus. Wir haben sowohl das Deutsche Datumsformat als auch das Euro-Symbol und das korrekte Trennzeichen.
Geben wird nun einen Betrag mit einem Komma wie 1657,47 ein wird der Wert nun auch korrekt gespeichert.
Converter
Als nächstes sehen wir uns an wie dies mit Convertern aussieht. Converter haben wir ja bereits in Kapitel 2.1.4.4 kennengelernt. Nun sehen wir uns an wie wir innerhalb eines Converters auf die aktuelle Kultur eingehen.
Hierfür erstellen wir einen Konverter mit dem Namen „TestConverter“. Dieser konvertiert im Moment nichts. Er soll uns nur dazu dienen zu sehen welche Culture wir in einem Converter hineingereicht bekommen.
VB.NET-Quellcode
- Public Class TestConverter
- Implements IValueConverter
- Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.Convert
- Debug.WriteLine("Aktuelles Währungssymbol: " & culture.NumberFormat.CurrencySymbol)
- Return value
- End Function
- Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.ConvertBack
- Throw New NotImplementedException()
- End Function
- End Class
Wir lassen uns hier schlicht das aktuelle Währungssymbol in die Konsole ausgeben um anschließend einfach den
value
so wie dieser ist wieder zurückzugeben. Der Konverter gibt folgenden Text in die Konsole aus:
Wir sehen also dass hier auch die Systemkultur mit übergeben wird und könnten nun darauf reagieren um Beispielsweise Umwandlungen zu vollziehen.
Fazit: Die WPF nimmt per Default immer
en-US
als Culture heran. Dies muss vom Entwickler überschrieben werden da sonst immer und überall das amerikanische Format verwendet wird.
Dies ist wie wir gesehen haben auch sehr wichtig da es ansonsten zu sehr unangenehmen Nebeneffekten kommen kann welche oft gerne mal länger unentdeckt bleiben.
Natürlich erkläre ich dies alles auch wieder interaktiv in einem Video wo ihr besser sehen könnt wie jeder Schritt funktioniert.
Ich freue mich auch über jedes Like oder ein Kommentar im Video oder dem Kanal.
Hier die Solution: 2_1_4_8_Culture.zip
Und wie immer auch das PDF für euer E-Book: Tutorialreihe WPF lernen 2_1_4_8.pdf
Ich freue mich wie immer über Kommentare, Kritik und Vorschläge sowie natürlich auch likes/hilfreich.
Entweder im Supportthread oder auf meinem YouTube Kanal.
Grüße
Sascha
If _work = worktype.hard Then Me.Drink(Coffee)
Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.
## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##
Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.
## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##