При нажатии на Сумма в примере ArbitraryMethod из Лекция 7, VS 2013 выдается ошибка: Необработанное исключение типа "System.InvalidOperationException" в System.Windows.Forms.dll Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "lblResult" не из того потока, в котором он был создан. Затем: Необработанное исключение типа "System.InvalidOperationException" в mscorlib.dll Дополнительные сведения: Для каждой асинхронной операции метод EndInvoke может вызываться только один раз. |
Справочные материалы. перевод приложений. специальные возможности
В конструкторе формы извлекается текстовая переменная из заданного ресурса:
public Form1() { InitializeComponent(); //Инициализируем переменные EnglishCulture = "en-US"; RussianCulture = "ru-RU"; // Перменной CultureDefine присваиваем значение культуры, установленной на компьютере, //используя свойство класса ResourceManager CultureDefine = CultureInfo.InstalledUICulture.ToString(); // Создаем новый объект resourceManager, извлекающий из сборки //текстовую переменную ClosingText resourceManager = new ResourceManager("TextEditor.ClosingText", Assembly.GetExecutingAssembly()); }Листинг 8.3.
Перегружаем конструктор формы:
public Form1(string FormCulture) { InitializeComponent(); EnglishCulture = "en-US"; RussianCulture = "ru-RU"; //В качестве культуры устанавливаем значение CultureDefine CultureDefine = FormCulture; // Создаем новый объект resourceManager, извлекающий из сборки //текстовую переменную ClosingText resourceManager = new ResourceManager("TextEditor.ClosingText", Assembly.GetExecutingAssembly()); }Листинг 8.4.
Окно-предупреждение появляется при наступлении события формы Closing. Заменяем строку Do you want to save changes in this document? на извлекаемую переменную MessageText файла ресурса (выделено цветом):
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e) { … if(MessageBox.Show(resourceManager.GetString("MessageText"), "Message", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) … }
Добавляем возможность изменения языка при выборе определенного пункта меню. Создаем обработчик пункта меню mnuEnglish:
private void mnuEnglish_Click(object sender, System.EventArgs e) { //Устанавливаем английскую культуру в качестве выбранной. CultureDefine = EnglishCulture; // Устанавливаем выбранную культуру в качестве культуры пользовательского интерфейса Thread.CurrentThread.CurrentUICulture = new CultureInfo(CultureDefine, false); // Устанавливаем в качестве текущей культуры выбранную Thread.CurrentThread.CurrentCulture = new CultureInfo(CultureDefine, false); //Создаем новый экземпляр frm формы Form1: Form1 frm = new Form1(CultureDefine); //Скрываем текущий экземпляр this.Hide(); //Вызываем новый экземпляр frm.Show(); }Листинг 8.5.
Обработчик пункта меню mnuRussian аналогичен, только в качестве выбранной устанавливается русская культура:
private void mnuRussian_Click(object sender, System.EventArgs e) { CultureDefine = RussianCulture; Thread.CurrentThread.CurrentUICulture = new CultureInfo(CultureDefine, false); Thread.CurrentThread.CurrentCulture = new CultureInfo(CultureDefine, false); Form1 frm = new Form1(CultureDefine); this.Hide(); frm.Show(); }
Запускаем приложение. При изменении языка текущая форма скрывается, вместо нее появляется новая форма с нужным интерфейсом. При попытке закрыть форму с изменениями в сохраненном документе текст в окне предупреждения появляется на выбранном языке (рис. 8.31 и 8.32).
При закрывании видимой формы остаются запущенными скрытые копии. Для полного завершения работы с приложением в событии Closed формы Form1 создадим процедуру выхода:
private void Form1_Closed(object sender, System.EventArgs e) { Application.Exit(); }
Другие текстовые переменные, например, заголовок Message, также могут быть без труда локализованы при добавлении их в файлы ресурсов (рис. 8.33).
На диске, прилагаемом к книге, вы найдете приложение TextEditor (Code\Glava8\TextEditor).