This article has been localized into German by the community.
Applikations-Kultur/UICulture
Wenn Sie in Ihrer WPF-Anwendung ein wenig mit Zahlen oder Daten gearbeitet haben, z.B. mit einem der Artikel in diesem Tutorial, haben Sie vielleicht etwas Cooles bemerkt: Zahlen und Daten werden automatisch in einem Format angezeigt, das dem auf Ihrem Computer verwendeten Format entspricht. Wenn Sie in einem englischsprachigen Land leben, wird das nicht erstaunlich sein, aber wenn Sie in einem der VIELEN Länder leben, in dem Daten und Zahlen anders angezeigt werden, ist das wirklich cool.
Und wenn Sie denken, dass es "sicherlich nicht so viele Unterschiede bei der Formatierung einfacher Dinge wie Zahlen und Daten geben kann", so schlage ich vor, dass Sie sich mal diese Beispiel-App ansehen, bei der ich die gleiche Zahl und das gleiche Datum formatiert habe, in den Darstellungen, wie sie in den USA, Deutschland und Schweden benutzt werden:
Wie Sie sehen können, gibt es viele feine Unterschiede in der Darstellung von Zahlen und Datumswerten. Die gute Nachricht ist, dass das .NET-Framework Ihnen viel abnehmen kann - in der Tat tut es das bereits: Standardmäßig werden Daten und Zahlen gemäß den Systemeinstellungen des Computers formatiert, auf dem Ihre Anwendung ausgeführt wird. Die schlechte Nachricht ist, dass dies nicht immer das gewünschte Verhalten ist. Aber keine Sorge - Sie können das leicht ändern. Es geht um die Verwendung der CultureInfo-Klasse, über die Sie viel mehr im C# Tutorial-Artikel über CultureInfo lesen können.
Ad-hoc-Formatierung
Wenn Sie nur eine bestimmte Information formatieren müssen, z.B. den Inhalt eines einzelnen Label-Controls, können Sie dies ganz einfach on-the-fly mit einer Kombination aus der Methode ToString() und der Klasse CultureInfo tun. Zum Beispiel habe ich im obigen Beispiel verschiedene, kulturbasierte Formatierungen wie diese angewendet:
double largeNumber = 123456789.42;
CultureInfo usCulture = new CultureInfo("en-US");
CultureInfo deCulture = new CultureInfo("de-DE");
CultureInfo seCulture = new CultureInfo("sv-SE");
lblNumberUs.Content = largeNumber.ToString("N2", usCulture);
lblNumberDe.Content = largeNumber.ToString("N2", deCulture);
lblNumberSe.Content = largeNumber.ToString("N2", seCulture);
Dies kann in einigen Fällen ausreichen, in denen Sie nur an einigen Stellen eine spezielle Formatierung benötigen, aber im Allgemeinen sollten Sie entscheiden, ob Ihre Anwendung Systemeinstellungen (Standard) verwenden soll oder ob Sie dieses Verhalten besser mit einer bestimmten Kultureinstellung für die gesamte Anwendung überschreiben möchten.
CurrentCulture & CurrentUICulture
Es ist ganz einfach, eine andere Kultur auf Ihre WPF-Anwendung anzuwenden. Sie werden vermutlich zwei Attribute benutzen, die sich in der CurrentThread-Eigenschaft der Thread-Klasse befinden: CurrentCulture und CurrentUICulture. Aber wo ist der Unterschied?
Die CurrentCulture-Eigenschaft ist diejenige, die steuert, wie Zahlen, Datumsangaben usw. formatiert werden. Der Standardwert stammt aus dem Betriebssystem des Computers, der die Anwendung ausführt, und kann vom User unabhängig von der Sprache des Betriebssystems geändert werden. So ist es beispielsweise für eine in Deutschland lebende Person sehr häufig, Windows mit Englisch als Oberflächensprache zu installieren, während sie dennoch die deutsche Bezeichnung für Zahlen und Datumswerte bevorzugt. In einer solchen Situation würde die CurrentCulture-Eigenschaft standardmäßig auf Deutsch stehen, trotz des englischen Betriebssystems.
Die Eigenschaft CurrentUICulture gibt die Sprache an, die die Benutzerschnittstelle verwenden soll. Dies ist nur relevant, wenn Ihre Anwendung mehrere Sprachen unterstützt, z.B. durch die Verwendung von Sprachressourcendateien. Dies ermöglicht es Ihnen wiederum, eine Kultur für die Sprache zu verwenden (z.B. Englisch), während Sie eine andere (z.B. Deutsch) verwenden, wenn es um die Ausgabe von Zahlen, Datumswerten usw. geht.
Ändern der Kultur für die Applikation
Vor diesem Hintergrund müssen Sie sich nun entscheiden, ob Sie die CurrentCulture und/oder die CurrentUICulture ändern wollen. Diese Änderung können Sie jederzeit machen, aber es macht am meisten Sinn, es beim Starten Ihrer Anwendung zu tun - andernfalls könnte es sein, dass einige Ausgaben bereits mit der Standardkultur vor der Umschaltung erzeugt wurden. Hier ist ein Beispiel, wo wir die Kultur sowie die UICulture im Ereignis Application_Startup() ändern, das in der Datei App.xaml.cs Ihrer WPF-Anwendung verwendet werden kann:
private void Application_Startup(object sender, StartupEventArgs e)
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
}
Da wir sowohl die Thread-Klasse als auch die CultureInfo verwenden, vergessen Sie nicht, die erforderlichen namespaces zu Ihrer Datei hinzuzufügen, falls sie nicht bereits vorhanden sind:
using System.Threading;
using System.Globalization;
Damit werden Zahlen und Daten nun so formatiert, wie sie es in Deutsch bevorzugen (de-DE). Wie bereits erwähnt, können Sie die Zeile, die die Kultur für die UICulture definiert (die letzte Zeile), weglassen, wenn Ihre Anwendung nicht mehrere Sprachen unterstützt.
Das Ändern der Kultur während des Application_Startup-Ereignisses oder spätestens im Konstruktor Ihres Hauptfensters ist sehr sinnvoll, da bereits generierte Werte nicht automatisch aktualisiert werden, wenn Sie die CurrentCulture-Eigenschaft ändern. Das bedeutet nicht, dass Sie es nicht tun können, wie dieses nächste Beispiel zeigt, das auch als gute Demonstration dafür dient, wie die Ausgabe von der CurrentCulture-Eigenschaft beeinflusst wird:
<Window x:Class="WpfTutorialSamples.WPF_Application.ApplicationCultureSwitchSample"
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"
xmlns:local="clr-namespace:WpfTutorialSamples.WPF_Application"
mc:Ignorable="d"
Title="ApplicationCultureSwitchSample" Height="200" Width="320">
<StackPanel Margin="20">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Label>Number:</Label>
<Label Name="lblNumber" Grid.Column="1" />
<Label Grid.Row="1">Date:</Label>
<Label Name="lblDate" Grid.Row="1" Grid.Column="1" />
</Grid>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="0,20">
<Button Tag="en-US" Click="CultureInfoSwitchButton_Click" HorizontalContentAlignment="Stretch">English (US)</Button>
<Button Tag="de-DE" Click="CultureInfoSwitchButton_Click" HorizontalContentAlignment="Stretch" Margin="10,0">German (DE)</Button>
<Button Tag="sv-SE" Click="CultureInfoSwitchButton_Click" HorizontalContentAlignment="Stretch">Swedish (SE)</Button>
</StackPanel>
</StackPanel>
</Window>
using System;
using System.Globalization;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
namespace WpfTutorialSamples.WPF_Application
{
public partial class ApplicationCultureSwitchSample : Window
{
public ApplicationCultureSwitchSample()
{
InitializeComponent();
}
private void CultureInfoSwitchButton_Click(object sender, RoutedEventArgs e)
{
Thread.CurrentThread.CurrentCulture = new CultureInfo((sender as Button).Tag.ToString());
lblNumber.Content = (123456789.42d).ToString("N2");
lblDate.Content = DateTime.Now.ToString();
}
}
}
Der interessante Teil befindet sich im CultureInfoSwitchButton_Click-Ereignis, wo wir CurrentCulture basierend darauf einstellen, welche der Schaltflächen angeklickt wurden, und dann die beiden Labels mit einer Zahl und einem Datum aktualisieren:
Kulture & Threads: Die DefaultThreadCurrentCulture Eigenschaft
Wenn Ihre Anwendung mehr als einen Thread verwendet, sollten Sie die Eigenschaft DefaultThreadCurrentCulture verwenden. Es befindet sich in der CultureInfo-Klasse (eingeführt in .NET Framework Version 4.5) und stellt sicher, dass nicht nur der aktuelle Thread, sondern auch zukünftige Threads die gleiche Kultur verwenden. Sie können es so verwenden, z.B. im Ereignis Application_Startup:
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("de-DE");
Müssen Sie also sowohl die Eigenschaften CurrentCulture als auch DefaultThreadCurrentCulture einstellen? Eigentlich nicht - wenn Sie die CurrentCulture-Eigenschaft nicht bereits geändert haben, wird die Einstellung der DefaultThreadCurrentCulture-Eigenschaft auch auf die CurrentCulture-Eigenschaft angewendet. Mit anderen Worten, es ist sinnvoll, die DefaultThreadCurrentCulture anstelle von CurrentCulture zu verwenden, wenn Sie planen, mehrere Threads in Ihrer Anwendung zu verwenden - sie kümmert sich um alle Szenarien.
Zusammenfassung
Der Umgang mit der Kultur Ihrer WPF-Anwendung ist sehr wichtig, aber zu ihrem Glück wird WPF für Sie viel davon komplett out-of-the-box erledigen. Wenn Sie das Standardverhalten ändern müssen, ist es auch ganz einfach die Eigenschaften CurrentCulture und CurrentUICulture zu verwenden, wie die zahlreichen Beispiele dieses Artikels zeigen.