This article has been localized into Italian by the community.
Culture / UICulture dell'Applicazione
Se hai lavorato un po' con numeri o date nella tua applicazione WPF, ad es. a causa di uno degli articoli trovati in questo tutorial, potresti aver notato qualcosa di interessante: i numeri e le date vengono automaticamente visualizzati in un formato che corrisponde al formato utilizzato sul tuo computer. Se vivi in un paese di lingua inglese, probabilmente questo non ti sembra una grande cosa, ma se vivi in uno dei MOLTI paesi in cui date e / o numeri sono visualizzati in modo diverso, questo è davvero interessante.
E se stai pensando "sicuramente non ci possono essere così tante differenze quando si formattano cose semplici come numeri e date?", Ti suggerisco di dare un'occhiata a questa applicazione di esempio, dove ho formattato lo stesso numero e la stessa data in base a come lo preferiscono negli Stati Uniti, in Germania e in Svezia:
Come puoi vedere, ci sono molte sottili differenze nel modo in cui vengono visualizzati i numeri e le date. La buona notizia è che il framework .NET può aiutarti molto, anzi, lo fa già: per impostazione predefinita, date e numeri sono formattati in base alle impostazioni di sistema del computer in cui viene eseguita l'applicazione. La cattiva notizia è che questo comportamento potrebbe non essere sempre quello che vuoi. Ma non preoccuparti: puoi facilmente cambiarlo. Tutto si riferisce all'uso della classe CultureInfo , di cui puoi leggere molto di più in C# Tutorial article on CultureInfo. Per ora, discutiamo su come applicare queste tecniche alla tua applicazione WPF.
Formattazione ad-hoc
Se hai solo bisogno di applicare la formattazione per una specifica informazione, ad es. il contenuto di un singolo controllo Label, puoi farlo facilmente, al volo, utilizzando una combinazione del metodo ToString () e della classe CultureInfo . Ad esempio, nell'esempio sopra, ho applicato una diversa formattazione basata sulla cultura in questo modo:
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);
Ciò potrebbe essere sufficiente in alcuni casi in cui hai solo bisogno di una formattazione speciale in un paio di punti, ma in generale, dovresti decidere se l'applicazione deve utilizzare le impostazioni di sistema (l'impostazione predefinita) o se è necessario sovrascrivere questo comportamento con un'impostazione di cultura specifica per l'intera applicazione.
CurrentCulture & CurrentUICulture
Applicare un'altra cultura alla tua applicazione WPF è abbastanza semplice. Potresti, potenzialmente, avere a che fare con due attributi, trovati nella proprietà CurrentThread della class Thread:CurrentCulture e CurrentUICulture. Ma qual è la differenza?
La proprietà CurrentCulture è quella che controlla la modalità di formattazione di numeri e date, ecc. Il valore predefinito deriva dal sistema operativo del computer che esegue l'applicazione e può essere modificato indipendentemente dalla lingua utilizzata dal loro sistema operativo. Ad esempio, è molto comune per una persona che vive in Germania installare Windows con l'inglese come lingua di interfaccia, preferendo comunque la notazione tedesca per numeri e date. Per una situazione come questa, la proprietà CurrentCulture si imposta automaticamente in tedesco.
La proprietà CurrentUICulture specifica la lingua che l'interfaccia deve utilizzare. Ciò è rilevante solo se l'applicazione supporta più lingue, ad es. attraverso l'uso di file di risorse linguistiche. Ancora una volta, questo ti permette di usare una cultura per la lingua (ad es. Inglese), mentre ne usi un'altra (ad esempio tedesco) quando si tratta di input / output di numeri, date, ecc.
Cambiare la Cultura di un'applicazione
Con questo in mente, ora devi decidere se modificare CurrentCulture e / o CurrentUICulture. Può essere fatto praticamente ogni volta che vuoi, ma ha più senso farlo all'avvio dell'applicazione - altrimenti, alcuni output potrebbero essere già generati con la cultura predefinita, prima del cambio. Ecco un esempio in cui modifichiamo Culture e UICulture nell'evento Application_Startup () che può essere utilizzato nel file App.xaml.cs dell'applicazione WPF:
private void Application_Startup(object sender, StartupEventArgs e)
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
}
Poiché utilizziamo la classe Thread e CultureInfo, non dimenticare di aggiungere gli spazi dei nomi (namespace) richiesti al tuo file, se non sono già presenti:
using System.Threading;
using System.Globalization;
A questo punto, i numeri e le date verranno ora formattati in base alla loro preferenza in tedesco ( de-DE ). Come accennato, puoi escludere la linea che definisce la cultura per UICulture (l'ultima riga) se l'applicazione non supporta più lingue.
Cambiare la cultura durante l'evento Application_Startup , o al più tardi nel costruttore della tua finestra principale, ha più senso, perché i valori che sono già generati non si aggiornano automaticamente quando cambi la properietà CurrentCulture . Ciò non significa che non puoi farlo, come illustrato dal prossimo esempio, che serve anche come dimostrazione di come l'output sia influenzato dalla proprietà 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();
}
}
}
La parte interessante si trova nell'evento CultureInfoSwitchButton_Click, dove impostiamo CurrentCulture in base a quale dei pulsanti è stato premuto, quindi aggiorniamo le due etichette contenenti un numero e una data:
Culture & Threads: La proprietà DefaultThreadCurrentCulture
Se l'applicazione utilizza più di un thread, dovresti considerare l'utilizzo della proprietà DefaultThreadCurrentCulture . Può essere trovata nella classe CultureInfo (introdotto in .NET framework versione 4.5) e farà in modo che non solo il thread corrente, ma anche i thread futuri utilizzino la stessa cultura. Puoi usarlo in questo modo, ad es. nell'evento Application_Startup :
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("de-DE");
Quindi, dovrai impostare sia le proprietà CurrentCulture e DefaultThreadCurrentCulture ? In realtà, no, se non è già stata modificata la proprietà CurrentCulture, l'impostazione della proprietà DefaultThreadCurrentCulture verrà applicata anche alla proprietà CurrentCulture. In altre parole, ha senso utilizzare DefaultThreadCurrentCulture invece di CurrentCulture se si prevede di utilizzare più thread nell'applicazione: si prenderà cura di tutti gli scenari.
Sommario
Affrontare la cultura della tua applicazione WPF è molto importante, ma fortunatamente per te, WPF ne se ne occuperà autonomamente. Modificare il comportamento predefinito, è abbastanza semplice, utilizzando le proprietà CurrentCulture e CurrentUICulture , come illustrato nei numerosi esempi di questo articolo.