2016-02-01 7 views
5

У меня есть следующий код XAML:Почему я не могу использовать CultureInfo.CurrentCulture в XAML во время разработки?

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

s:DateTime.Now с xmlns:s="clr-namespace:System;assembly=mscorlib" отлично работает во время выполнения, а также в режиме разработки (Visual Studio 2015 Enterprise).

Но если попробовать то же самое с CultureInfo.CurrentCulture, то работает только на время выполнения и дает мне ошибку в режиме конструктора (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}}"/> 

Я не искал обходной путь. Я только пытаюсь понять разницу между DateTime.Now и CultureInfo.CurrentCulture и почему один из них работает, а другой нет.

+2

Какая ошибка дает вам? Вы уверены, что разница между 'DateTime.Now' и' CultureInfo.CurrentCulture', а не разница между 'Source' и' ConverterCulture'? (Нечетный, как и было бы, попробуйте указать «Source» как «CultureInfo.CurrentCulture», просто чтобы узнать, все еще выдаст ошибку.) –

+0

Я копирую/вставляю два бита XAML, которые вы разделили в пустой проект, и он отлично работает , как в режиме разработки, так и во время выполнения. Пожалуйста, предоставьте хороший [mcve], который надежно воспроизводит проблему. Пожалуйста, также уточните, какая у вас проблема; укажите текст сообщения об ошибке _exact_ и контекст, в котором происходит ошибка. –

+1

Он воспроизводит проблему на моем конце. Я также пробовал, что предложил @JonSkeet, и проблема действительно 'CurrentCulture'. Кстати, документация CurrentCulture гласит: «Объект, представляющий культуру, используемую текущим потоком». Разве это не проблема? То, что во время разработки нет «текущей нити». 'DefaultThreadCurrentCulture',' InstalledUICulture', 'InvariantCulture' и' DefaultThreadCurrentUICulture' работают нормально. Только «CurrentCulture» и «CurrentUICulture» действуют. –

ответ

0

I знайте, что вы не попросили обходного пути, и я не могу ответить на ваш первоначальный вопрос.

Я все еще хочу опубликовать свое решение в случае, если другие, как и я, спотыкаются о вашем вопросе в поисках обходного пути.

Если вы установили ConverterCulture в класс CustomBinding и используете этот CustomBinding вместо Binding в xaml, он также работает во время разработки.

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

Вы можете использовать его в своем xaml, как это.

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

В качестве дополнительного преимущества это позволяет в дальнейшем конвертировать конвертер в одном месте, если необходимо. Также вы можете установить другие свойства, такие как StringFormat, как это.

+0

Хотя это действительно не отвечает на мой вопрос, это по-прежнему лучший ответ. Я пробовал, и это работает. Спасибо! –

0

Я видел такое же поведение, и наилучшим ответом является то, что CurrentCulture и CurrentUICulture являются , а не полезными при разработке, если вы не установите его. Как и во многих других конструкциях презентации WPF, иногда ваша модель представления или другие свойства должны учитывать время разработки, чтобы ваши визуальные элементы отображались так, как ожидалось, в вашем дизайнере VS. Например, инфраструктура MVVM Galasoft включает в себя свойство IsDesignTime. Вы можете использовать это (или независимо от того, что предоставляет ваша собственная инфраструктура) для специального случая для свойства, если IsDesignTime истинно, установите его в какое-то значение, подходящее для отображения. Это удобно, например, когда вы хотите увидеть, как оно появляется, когда вы устанавливаете эту культуру на другие языки.

Таким образом, для примера, предполагается, что вы действительно использует тип MVVM архитектуры - вы можете связать свой TextBlock Text собственность на свою собственную виде-модели собственность, и имеете что свойства присутствовать на определение текущего DateTime и CurrentCulture.

Одно замечание: помните, что с WPF на настольных приложениях окно Window или UserControl ctor не выполняется в среде разработки - только во время выполнения. Это может запутаться, пока вы не поймете это.

0

У меня были те же проблемы не так давно, я бы очень предложил использовать этот пакет самородок для локализации. Он довольно прост в использовании. https://www.nuget.org/packages/WpfLocalizeExtension/

Пример AssemblyName = Применение

RessourceFile = MainApplication.resx

Ressource1Key1 = Test

Если вы используете MVVM здесь некоторый фрагмент кода.

XAML

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

Определение содержимого для метки, кнопки и т.д. ...

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

В ViewModel Вы хотите связать свою кнопку с командой 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 
    } 
Смежные вопросы