This article has been localized into Dutch by the community.
Applicatie Cultuur / UICultuur
Wanneer je een beetje gewerkt hebt met cijfers of datums in je WPF-applicatie, bv. bij één van de artikelen in deze tutorial, is het je misschien opgevallen dat er iets tofs is: nummers en datums worden automatisch weergegeven in een formaat dat overeenkomt met het formaat dat op je computer wordt gebruikt. Als je in een Engelssprekend land woont, lijkt dit waarschijnlijk niet zo belangrijk, maar als je in een van de VELE landen woont waar datums en / of nummers anders worden weergegeven, is dit echt gaaf.
En als je denkt "er waarschijnlijk niet zoveel verschil zit in simpele datum of getal formaten", stel ik voor om naar de volgende simpele app te kijken, waar ik de formaten gebruik zoals de voorkeuren zijn in de USA, Duitsland en Zweden:
Zoals je kunt zien zitten er subtiele verschillen in het weergeven van getallen en datums. Het goede nieuws is dat het .NET framework je veel kan helpen. In feite doet ze dat al: standaard worden de formaten gebruikt zoals ze in de instelling van de computer staan waar de app ook op draait. Het slechte nieuws is dat dit niet altijd wenselijk is. Maar niet getreurd, je kunt dit eenvoudig aanpassen. Het heeft allemaal te maken met het gebruik van de CultureInfo klasse. Hierover kun je meer lezen in het C# Tutorial article on CultureInfo. Nu bespreken we alleen hoe deze technieken te gebruiken in jouw WPF app.
Ad hoc formateren
Als je alleen een specifiek deel van de informatie moet gebruiken voor een formaat, b.v. de inhoud van een Label control, dan kan dit eenvoudig, on-the-fly, door gebruik te maken van de combinatie van de ToString() methode and the CultureInfo klasse. In bijvoorbeeld bovenstaande voorbeeld gebruikte ik verschillende cultuur gebaseerde formaten zoals:
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);
Dit zal voldoende zijn in sommige gevallen wanneer je deze formaten maar op een paar plekken in de code nodig hebt, maar in het algemeen zul je besluiten of jouw applicatie de systeem instellingen (standaard) overneemt of een specifieke cultuur-setting voor de gehele applicatie.
CurrentCulture & CurrentUICulture (Huidig Culture & Huidig UICulture)
Het gebruiken van een andere cultuurinstelling in jouw WPF applicatie is simpel. Je krijgt mogelijk te maken met twee attributen: de CurrentThread propertie of de Thread klasse: CurrentCulture and CurrentUICulture. Maar wat is het verschil?
De CurrentCulture propertie controleert hoe de getallen, datums etc. zijn geformatteerd. De standaard waarde komt uit het operating system (OS) van de computer waar de applicatie draait en kan onafhankelijk van de OS-taal worden gewijzigd. Het is bijvoorbeeld gebruikelijk voor een Duitser om de Engelstalige Windows met interfaces te installeren, terwijl hij wel de duitse notatie voor getallen en datums wil gebruiken. In deze situatie wordt de CurrentCulture propertie op 'Duits' gezet.
De CurrentUICulture property geeft aan welke taal de interface moet gebruiken. Dit is enkel relevant als uw applicatie meerdere talen ondersteunt, e.g. door het gebruik van taal-bronbestanden. Eens te meer maakt dit het mogelijk om een culture te gebruiken voor de taal (e.g. Engels), en tegelijk een andere taal (e.g. Duits) wanneer je bezig bent met input/output van getallen, datums, enz.
Wijzigen van de applicatie Cultuur
Met dat in gedachten, moet je nu beslissen of je de CurrentCulture en/of de CurrentUICulture wilt wijzigen. Dit kan eigenlijk op elk moment, maar is het meest zinvol bij de starten van de bouw van de applicatie. Want anders kan er al output zijn gegenereerd met de standaard culture, voor de wijziging. Hier een voorbeeld van het wijzigen van de Culture en de UICulture, in de Application_Startup() gebeurtenis, welke kan worden gebruikt in de App.xaml.cs file van jouw WPF applicatie:
private void Application_Startup(object sender, StartupEventArgs e)
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
}
Omdat we zowel de Thread klasse als ook de CultureInfo gebruiken, moet je niet vergeten om de noodzakelijke namespaces toe te voegen aan de file, als ze er al niet waren:
using System.Threading;
using System.Globalization;
Hierdoor zullen de getallen en datums geformateerd worden in de Duitse setting (de-DE). Zoals gezegd, hoef je de regel voor de UICulture (de laatste) niet op te nemen als jouw applicatie geen meervoudige talen gebruikt.
Wijzigen van de cultuur gedurende de Application_Startup gebeurtenis (of op het laatst in de constructor van jouw hoofd window) is het meest logisch, omdat waarden die al gegenereerd zijn niet automatisch mee veranderen bij een wijziging in de CurrentCulture property. Dat betekent niet dat het niet zou kunnen, zoals geïllustreerd in het volgende voorbeeld, welke tevens laat zien hoe de output wordt beïnvloed door de CurrentCulture propertie:
<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();
}
}
}
Het interessante gedeelte is terug te vinden in het CultureInfoSwitchButton_Click-event, waar we CurrentCulture instellen op basis van de knop waarop werd geklikt, en vervolgens de twee labels bijwerken die een nummer en een datum bevatten:
Culture & Threads: De DefaultThreadCurrentCulture propertie
Als jouw applicatie meer dan een thread gebruikt, moet je overwegen om de DefaultThreadCurrentCulture propertie te gebruiken. Het kan worden gevonden in de CultureInfo klasse (geintroduceerd in .NET framework versie 4.5) en zorgt ervoor dat niet alleen de huidige thread, maar ook toekomstige threads dezelfde cultuur gebruiken. Je kunt het op de volgende manier gebruiken zoals in de Application_Startup gebeurtenis:
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("de-DE");
Heb je nu op deze manier zowel de CurrentCulture EN de DefaultThreadCurrentCulture properties ingesteld? Eigenlijk niet. Als je al niet de CurrentCulture propertie hebt gewijzigd, zal de instelling van de DefaultThreadCurrentCulture propertie ook toegepast worden op de CurrentCulture propertie. In andere woorden, het is logisch om de DefaultThreadCurrentCulture te gebruiken in plaats van de CurrentCulture als je van plan bent meerdere threads te gebruiken in jouw applicatie - Het regelt alle scenario's.
Samenvattend
Rekening houden met de cultuur van jouw WPF applicatie is erg belangrijk, maar gelukkig voor jou zal WPF veel totaal 'out-of-the-box' doen. Als je het standaardgedrag moet wijzigen is het best handig om de CurrentCulture en CurrentUICulture properties te gebruiken, zoals geillustreerd in verschillende voorbeelden in dit artikel.