|
При нажатии на Сумма в примере 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).



