2016-02-01 16 views
5

Ho il seguente XAML:Perché non posso utilizzare CultureInfo.CurrentCulture in XAML in fase di progettazione?

<TextBlock Text="{Binding Source={x:Static s:DateTime.Now}, StringFormat=Date: {0:dddd, MMMM dd}}"/> 

s:DateTime.Now con xmlns:s="clr-namespace:System;assembly=mscorlib" funziona bene in fase di esecuzione, nonché in modalità di progettazione (Visual Studio 2015 Enterprise).

Ma se provo lo stesso con CultureInfo.CurrentCulture, allora questo funziona solo a runtime e mi dà un errore nella modalità di progettazione (xmlns:c="clr-namespace:System.Globalization;assembly=mscorlib"):

<TextBlock Text="{Binding Source={x:Static s:DateTime.Now}, ConverterCulture={x:Static c:CultureInfo.CurrentCulture}, StringFormat=Date: {0:dddd, MMMM dd}}"/> 

Io non sto cercando una soluzione alternativa. Sto solo cercando di capire la differenza tra DateTime.Now e CultureInfo.CurrentCulture e perché uno di loro funziona e l'altro no.

+2

Che errore ti dà? Sei sicuro che la differenza sia tra 'DateTime.Now' e' CultureInfo.CurrentCulture', piuttosto che la differenza tra 'Source' e' ConverterCulture'? (Strano come sarebbe, prova a specificare 'Source' come' CultureInfo.CurrentCulture', solo per vedere se questo dà ancora un errore.) –

+0

I copia/incolla i due bit XAML che hai condiviso in un progetto vuoto, e funziona bene , in entrambe le modalità di progettazione e in fase di esecuzione. Si prega di fornire una buona [mcve] che riproduca in modo affidabile il problema. Si prega inoltre di essere più specifici su quale problema si sta avendo; fornire il testo del messaggio di errore _exact_ e il contesto in cui si verifica l'errore. –

+1

Riproduce il problema sulla mia estremità. Ho anche provato cosa suggerito da @JonSkeet e il problema è effettivamente 'CurrentCulture'. A proposito, la documentazione di 'CurrentCulture' dice:' Un oggetto che rappresenta la cultura usata dal thread corrente. Non è questo il problema? Che non c'è "filo corrente" in fase di progettazione. 'DefaultThreadCurrentCulture',' InstalledUICulture', 'InvariantCulture' e' DefaultThreadCurrentUICulture' funzionano correttamente. Solo "CurrentCulture" e "CurrentUICulture" stanno funzionando. –

risposta

0

I sapere che non hai chiesto una soluzione alternativa e non posso rispondere alla tua domanda originale.

Desidero ancora pubblicare la mia soluzione nel caso in cui altri, come me, inciampano nella tua domanda alla ricerca di una soluzione alternativa.

Se si imposta ConverterCulture in una classe CustomBinding e si utilizza questa CustomBinding anziché Binding in xaml, funziona anche in fase di progettazione.

public class CultureAwareBinding : System.Windows.Data.Binding 
{ 
    public CultureAwareBinding() 
    { 
     ConverterCulture = CultureInfo.CurrentCulture; 
    } 
} 

Puoi usarlo nel tuo xaml in questo modo.

<TextBlock Text="{CultureAwareBinding Source={x:Static s:DateTime.Now}, StringFormat=Date: {0:dddd, MMMM dd}}"/> 

Come ulteriore vantaggio, questo consente di modificare ConverterCulture in un unico punto, se necessario. Inoltre puoi impostare altre proprietà come StringFormat in questo modo.

+0

Anche se questo in effetti non risponde alla mia domanda, è ancora la migliore risposta. L'ho provato e funziona. Grazie! –

0

Ho visto questo stesso comportamento e la risposta migliore è considerare CurrentCulture e CurrentUICulture come qualcosa che è non disponibile in fase di progettazione a meno che non lo si imposti. Come per molti altri costrutti di presentazione WPF, a volte il modello di visualizzazione o altre proprietà devono prendere in considerazione la progettazione in modo che gli elementi visivi vengano visualizzati come previsto nel progettista VS. Ad esempio, il framework MVVM di Galasoft include una proprietà IsDesignTime. È possibile utilizzare quello (o qualsiasi altra cosa che il proprio framework fornisce) a caso speciale una proprietà, se IsDesignTime è true, impostarlo su un valore adatto per la visualizzazione. Questo è utile come, ad esempio, quando vuoi vedere come appare quando imposti quella cultura in altre lingue.

Così per il vostro esempio, supponendo che stanno effettivamente usando un tipo di architettura MVVM - si consiglia di vincolare il proprio proprietà Text TextBlock per la vostra proprietà vista-modello, e hanno che proprietà partecipare alla determinazione della corrente DateTime e la CurrentCulture.

Una nota: si ricorda che con WPF su applicazioni desktop, il controllo Window o UserControl non viene eseguito all'interno dell'ambiente di progettazione, solo in fase di esecuzione. Questo può creare confusione finché non te ne rendi conto.

0

Ho avuto gli stessi problemi non molto tempo fa, consiglio vivamente di utilizzare questo pacchetto di nugget per la localizzazione. È abbastanza facile da usare. https://www.nuget.org/packages/WpfLocalizeExtension/

Esempio AssemblyName = Applicazione

RessourceFile = MainApplication.resx

Ressource1Key1 = Test

Se si sta utilizzando MVVM ecco alcune frammento di codice.

XAML

xmlns:lex="http://wpflocalizeextension.codeplex.com" 
    lex:LocalizeDictionary.DesignCulture="en" 
    lex:ResxLocalizationProvider.DefaultAssembly="AssemblyName" 
    lex:ResxLocalizationProvider.DefaultDictionary="ressourceName" 

Definizione dei contenuti per l'etichetta, pulsante ecc ...

<Label Content="{lex:Loc AssemblyName:ResourceName:ResourceKey}"> 
<Label Content="{lex:Loc Application:MainApplication:Test}"> 

In ViewModel Si desidera vincolare il proprio pulsante per comandare FrenchUI, EnglishUI

private void FrenchUI() 
    { 
     LocalizeDictionary.Instance.SetCurrentThreadCulture = true; 
     LocalizeDictionary.Instance.Culture = new CultureInfo(ConfigurationManager.AppSettings["Culture"])//fr-CA; 
    } 

    private void EnglishUI() 
    { 
     LocalizeDictionary.Instance.SetCurrentThreadCulture = true; 
     LocalizeDictionary.Instance.Culture = new CultureInfo(ConfigurationManager.AppSettings["CultureUS"]);//en-US 
    }