Изменение языка во время выполнения, используя внешний файл и шаблон MVVM в C # - PullRequest
0 голосов
/ 06 ноября 2019

Мой сценарий:

Главное окно с SplitView и несколькими страницами, каждая из которых содержит метки, кнопки и вкладки. Я использую шаблон MVVM, теперь я хочу иметь возможность менять язык во время выполнения, используя, например, ComboBox. Языковые ключи должны быть прочитаны из внешнего файла, например .mdb-файла, потому что должна быть возможность изменить описание некоторых кнопок после компиляции.

Я уже много читал, большинство извремя они использовали файлы ресурсов или не следовали шаблону MVVM. Самым близким, что я нашел, было this .

. Здесь я сталкиваюсь с четырьмя проблемами:

  1. Они используют программный код MainWindow для установки DataContext,мой уже используется для меню: /
  2. Текст в моих ярлыках / кнопках должен быть изменен на нескольких страницах, как мне это сделать?
  3. Я генерирую некоторое содержимое меню в моемViewModel, как использовать здесь языковые ключи из файла? Я не могу связать их, как в XAML?
  4. Нет возможности выбрать, какой языковой параметр следует применять. (это я мог бы выяснить, как только узнаю, что концепцию стоит развивать вообще)

Я новичок в MVVM и C #, поэтому я еще не очень знакомс мышлением в шаблоне MVVM, но я надеюсь, что вы можете помочь мне найти решение:)

Редактировать: Связанный вопрос не решил мою проблему, потому что он не удовлетворяет мою потребностьдля языковых файлов, которые хранятся снаружи и могут быть изменены и считаны во время выполнения. Хотя это очень хороший подход, который я буду использовать, когда мне не нужно внешне изменять языковые файлы:)

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

В WPF есть словари ресурсов, которые хорошо подходят для этого.

Если вы объедините их в app.xaml, их значения перейдут в application.current.resources.

Это своего рода хеш-таблица, котораязатем становится доступным во всем приложении.

Вы можете объединять не скомпилированные словари ресурсов .xaml, используя тот же синтаксис.

Как объяснено:

https://social.technet.microsoft.com/wiki/contents/articles/28797.wpf-dynamic-xaml.aspx#Loading_a_Flat_File_as_a_Resource_Dictionary

Этот объединяемый Dictionary1.xaml является некомпилированным плоским файлом, который потенциально может быть заменен или отредактирован.

Вы можете ссылаться на ресурс с ключами, используя {staticresource keyname} или {dynamicresource keyname}.

В чем разница между StaticResource и DynamicResource в WPF?

Если вы сделаете все свои текстовые значения, вы хотите переключать строковые ресурсы в плоский не скомпилированный словарь ресурсов .xaml, тогда вы можете ссылаться на них вxaml.

Используйте динамический ресурс, и если ресурс будет изменен, вы получите новое значение в вашем textblock или label.

Таким образом, аналогично этой ссылке:

https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/how-to-use-a-resourcedictionary-to-manage-localizable-string-resources

Сделайте это с вашим приложением, скомпилируйте и предоставьте файл .xaml вместе с вашим распространяемым файлом. Пользователь видит следующие строки:

Скопируйте новый файл .xaml в этот словарь ресурсов.

Затем пользователь увидит значения в этом файле.

Отредактируйтефайл в блокноте и измените значение.

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

Вы также можете наложить значения на новые, имеющие тот же ключ.

Таким образом, вы можете получить словарь ресурсов исходных значений, скомпилированный в.

Дать им нескомпилированную копию.

Ваш код сливается с последним некомпилированной копией.

Если ониотредактируйте или замените его, они получат новые значения.

Если все пойдет ужасно неправильно, они могут очистить все содержимое не скомпилированного словаря ресурсов между тегами словаря. Затем они возвращаются к исходным значениям.

Вы также можете иметь несколько слоев для брендинга и локализации, а также объединять различные значки и строки.

Скажем, вы хотели управлять строками и еще чем-то без участия пользователя. .

Вы можете разместить свои настроенные файлы на веб-сайте.

Загрузить файл с сервера в appdata и объединить его в код.

Или вы можете хранить строкив базе данных xamlreader.parse в словарь ресурсов, который вы объединяете.

Я успешно использовал варианты подхода в нескольких проектах.

1 голос
/ 06 ноября 2019

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

Они используют код позади MainWindow, чтобы установить DataContext, мой ужеиспользуется для меню: /

Вам не нужно устанавливать DataContext. Привязки в xaml используют индексатор в модели представления. Вы можете добавить индексатор к вашей модели представления или (лучше) просто добавить свойство, возвращающее экземпляр StringResourceReader, тогда все локализуемые привязки станут

<TextBlock ... Text="{Binding PropertyName[TESTSTRING]}"/>

Текст в моих ярлыках / кнопках должен быть измененна нескольких страницах, как мне это сделать?

Смотри выше. Все модели представлений должны иметь индексатор или свойство.

В качестве альтернативы вы можете иметь статическое свойство где-нибудь и привязать к нему вместо изменения каждой модели представления. Но это сделает синтаксис привязки в xaml более длинным.

Я генерирую некоторое содержимое меню в моей ViewModel, как использовать здесь языковые ключи из файла? Я не могу связать их, как в XAML?

В коде просто позвоните rm.GetString(name) напрямую.

Нет возможности выбрать, какой языковой параметр следует применять,(это я мог бы понять, как только узнаю, что концепция вообще стоит того, чтобы ее использовать)

_fileName - это язык. Разные файлы - это разные локализации. Вам решать, как организовать, какой файл и на каком языке. Например, вы можете использовать две буквы где-нибудь в имени файла, чтобы легче определить язык.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...