культура преобразователя wpf! = en-US

Привет, у меня действительно странный эффект:

У меня есть главное окно, содержимое которого заполнено полным визуальным деревом, содержащим представление формы.

Первая форма для отображения — это родительская форма, которая позволяет вызывать дочернюю форму.

Когда я загружаю дочернюю форму, Parent в основном копируется в стек, а затем новое содержимое устанавливается в окно.

Когда я закрываю дочернюю форму, резервный родительский элемент возвращается в качестве содержимого окна, а дочернее окно удаляется.

Теперь о проблеме: я загружаю коллекцию объектов в список. В списке используются текстовые блоки для отображения свойств объектов (FirstName, LastName, PhoneNumber, MobileNumber, Email), и после каждого текстового блока в Xaml содержится запятая для разделения записей.

НО: если текстовый блок пуст, соответствующая запятая не должна отображаться, как показано ниже:

введите здесь описание изображения

Мне удалось сделать это с помощью конвертера, который анализирует, какие запятые показывать.

Это работает отлично, но когда я показываю дочернюю форму и закрываю ее, отображение искажается относительно видимости запятой:

введите здесь описание изображения

Я сделал два наблюдения:

  1. Поврежденное отображение происходит только тогда, когда у меня культура пользовательского интерфейса отличается от en-US (de-DE в моем случае).
  2. Я поместил некоторые трассировки в код преобразователя и вижу, что преобразователь вызывается после открытия (и закрытия) дочерней формы, когда я использую de-DE, но не когда я использую en-US.

Есть ли какие-либо идеи, что может вызвать такие эффекты? И как мне их обойти?

С уважением


person klawusel    schedule 09.09.2016    source источник


Ответы (1)


Наконец, я обнаружил, что проблема заключается в настройке Window.Language.

Я делаю это в конструкторе mainwindows:

this.Language = System.Windows.Markup.XmlLanguage.GetLanguage(Thread.CurrentThread.CurrentUICulture.Name);

Это необходимо, например, для правильного отображения чисел.

Но теперь выдаю следующий блок, и все работает во всех культурах. [Во время запуска я проверяю культуру пользовательского интерфейса по умолчанию, и если я устанавливаю любую другую, я соответствующим образом устанавливаю App.CultureChanged]:

    if (!App.CultureChanged )
        FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
    this.Language = System.Windows.Markup.XmlLanguage.GetLanguage(Thread.CurrentThread.CurrentUICulture.Name);
person klawusel    schedule 12.09.2016