This article is currently in the process of being translated into Danish (~90% done).
Application Culture / UICulture
Hvis du har arbejdet en smule med tal og datoer i din WPF applikation, f.eks. på grund af artiklerne i denne vejledning, har du nok bemærket noget interessant: Tal og datoer vises automatisk i et format, som passer med din computers format. Dette er måske ikke en stor ting, hvis du bor i et engelsk-talende land, men i mange andre lande vises tal og datoer forskelligt, så det er virklig smart.
Og hvis du tænker "der kan bestemt ikke være så mange forskelle, når du formaterer simple ting som tal og datoer?", foreslår jeg, at du tager et kig på denne eksempel app, hvor jeg har formateret det samme nummer og den samme dato i overensstemmelse med, hvordan de foretrækker det i USA, Tyskland og Sverige:

Som du kan se, er der mange subtile forskelle i, hvordan tal og datoer vises. Den gode nyhed er, at .NET frameworket kan hjælpe dig meget - det gør det faktisk allerede: Som standard formateres datoer og tal i overensstemmelse med systemindstillingerne på den computer, hvor din applikation udføres. Den dårlige nyhed er, at denne adfærd måske ikke altid er, hvad du ønsker. Men bare rolig – dette kan du nemt ændre. Det hele relaterer sig til brugen af CultureInfo-klassen, som du kan læse meget mere om i C# Tutorial-artiklen om CultureInfo. Lad os indtil videre diskutere, hvordan man anvender disse teknikker til din WPF-applikation.
Ad-hoc formatting
Hvis du kun skal anvende formatering for en bestemt information, f.eks. indholdet af en enkelt Label-kontrol, kan du nemt gøre dette i farten, ved at bruge en kombination af ToString()-metoden og CultureInfo-klassen. For eksempel anvendte jeg i eksemplet ovenfor forskellig, kulturbaseret formatering som denne:
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);Dette kan i nogle være tilstrækkeligt , når du blot har brug for speciel formatering et par steder, men generelt bør du beslutte, om din applikation skal bruge systemindstillinger (standard), eller om du skal tilsidesætte dette med en mere specifik kultur-indstilling for hele applikationen.
CurrentCulture & CurrentUICulture
Det er ret nemt at anvende en anden kultur i din WPF-applikation. Du vil potentielt have at gøre med to attributter, som findes på egenskaben CurrentThread i klassen Thread: CurrentCulture og CurrentUICulture. Men hvad er forskellen?
Det er egenskaben CurrentCulture, som styrer, hvordan tal og datoer osv. formateres. Standardværdien kommer fra operativsystemet på den computer, der udfører applikationen, og kan ændres uafhængigt af det sprog, der bruges af deres operativsystem. Det er for eksempel meget almindeligt, at en person, der bor i Tyskland, installerer Windows med engelsk som grænsefladesprog, mens de stadig foretrækker tysk notation for tal og datoer. I en situation som denne vil CurrentCulture-egenskaben som standard være tysk.
Egenskaben CurrentUICulture angiver det sprog, som grænsefladen skal bruge. Dette er kun relevant, hvis din applikation understøtter flere sprog, f.eks. gennem brug af sprog ressource filer. Endnu en gang giver dette dig mulighed for at bruge én kultur til sproget (f.eks. engelsk), mens du bruger en anden (f.eks. tysk), når du beskæftiger dig med input/output af tal, datoer osv.
Changing the application Culture
Med det i tankerne skal du nu beslutte, om du vil ændre CurrentCulture og/eller CurrentUICulture. Det kan gøres, når du vil - stort set-, men det giver mest mening at gøre det, når du starter din applikation - ellers kan noget output muligvis allerede være genereret med standardkulturen før skiftet. Her er et eksempel, hvor vi ændrer kulturen, såvel med UICulture, i Application_Startup()-begivenheden, som kan bruges i App.xaml.cs-filen i din WPF-applikation:
private void Application_Startup(object sender, StartupEventArgs e)
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
}Da vi såvel bruger Thread-klassen som CultureInfo, så glem ikke at tilføje de nødvendige namespaces til din fil, hvis de ikke allerede er til stede:
using System.Threading;
using System.Globalization;Når dette er på plads , vil tal og datoer blive formateret alt efter, hvordan de foretrækker det på tysk (de-DE). Som nævnt kan du udelade linjen, der definerer kulturen for UICulture (den sidste linje), hvis din forespørgsel ikke understøtter flere sprog.
Ændring af kulturen giver mest mening under begivenheden Application_Startup, eller senest i konstruktøren af dit hovedvinduet, fordi værdier, der allerede er genereret, ikke opdateres automatisk, når du ændrer egenskaben CurrentCulture. Det betyder dog ikke, at du ikke kan gøre det, som illustreret med det næste eksempel, som også tjener som en fin demonstration af, hvordan outputtet påvirkes af egenskaben CurrentCulture:
<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();
}
}
}Den interessante kode findes i CultureInfoSwitchButton_Click-begivenheden, hvor vi indstiller CurrentCulture baseret på, hvilken af knapperne der blev klikket på, og derefter opdaterer de to etiketter, der indeholder et tal og en dato:

Culture & Threads: The DefaultThreadCurrentCulture property
Hvis din applikation bruger mere end én tråd, bør du overveje at bruge egenskaben DefaultThreadCurrentCulture. Den kan findes på CultureInfo-klassen (introduceret i .NET framework version 4.5) og vil sikre, at ikke kun den nuværende tråd, men også fremtidige tråde vil bruge den samme kultur. Du kan bruge det sådan her, f.eks. i begivenheden Application_Startup:
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("de-DE");Så bliver du nødt til at indstille både CurrentCulture OG DefaultThreadCurrentCulture egenskaberne? Faktisk nej - hvis du ikke allerede har ændret CurrentCulture-egenskaben, vil ændringerne i DefaultThreadCurrentCulture-egenskaben også blive anvendt på CurrentCulture-egenskaben. Med andre ord giver det mening at bruge DefaultThreadCurrentCulture i stedet for CurrentCulture, hvis du planlægger at bruge flere tråde i din applikation - det vil tage håndtere alle scenarier.
Summary
Dealing with the culture of your WPF application is very important, but fortunately for you, WPF will do a lot of it for you completely out-of-the-box. If you need to change the default behavior, it's quite easy as well, using the CurrentCulture and CurrentUICulture properties, as illustrated in the numerous examples of this article.