2016-07-13 4 views
2

У меня есть расширенный класс кнопок следующим образом;Кнопка подсказка не получается локализованной

class ExtendedButton : Button 
{ 
    private ToolTip _tooltip = new ToolTip(); 

    public ExtendedButton() 
    { 
     _tooltip.SetToolTip(this, StringResources.MyLocalizedTooltipString); 
    } 
} 

В коде выше, 'StringResources.MyLocalizedTooltipString' содержит строки для различных языков. Но когда я изменяю культуру темы, текст всплывающей подсказки не изменяется. Как это сделать? Любая помощь будет оценена по достоинству.

+0

Можете ли вы показать нам, как вы меняете культуру нитей? –

ответ

2

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

Если вы хотите, чтобы ваша подсказка динамически использовать текущую культуру automatially, в качестве опции можно установить фиктивный текст в качестве всплывающей подсказки (чтобы включить всплывающую подсказку), а затем обработать Popup события подсказки, присвоить локализованное значение в подсказку:

class ExtendedButton : Button 
{ 
    private ToolTip _tooltip = new ToolTip(); 

    public ExtendedButton() 
    { 
     _tooltip.Popup += new PopupEventHandler(_tooltip_Popup); 
     _tooltip.SetToolTip(this, "DUMMYTEXT"); 
    } 

    void _tooltip_Popup(object sender, PopupEventArgs e) 
    { 
     if (_tooltip.GetToolTip(this) != StringResources.MyLocalizedTooltipString) 
      _tooltip.SetToolTip(this, StringResources.MyLocalizedTooltipString); 
    } 
} 

Примечания: Если ваша цель не делают подсказки динамически локализуемой и вы хотите только локализуемую подсказку, путь Localizable свойства Form работ, идти к дизайнеру вашего ExtendedButton компонента и установить Localizable свойства true, а затем использовать различные тексты подсказок для разных cltures.

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

Вот пример:

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fa-IR"); 
var f = new Form(); 
f.Controls.Add(new ExtendedButton()); 
f.Show(); 
+0

Сообщите мне, если у вас есть вопросы по поводу ответа. Я проверил коды и динамическая локализация во время выполнения работает правильно, используя эти изменения в компоненте. Для проверки достаточно иметь StringResources.resx и еще один, например StringResources.fa-IR.resx, и показать форму, содержащую кнопку. Затем измените «CurrentUICulture» во время выполнения и посмотрите результат. –

+0

Спасибо! Это прекрасно работает. –

+0

Добро пожаловать :) Надеюсь, вы поняли. –

0

Чтобы всесторонне установить культуру, вам необходимо установить CurrentCulture и CurrentUICulture для текущего потока, и если вы собираетесь создавать новые темы в вашем приложении, DefaultThreadCurrentCulture и DefaultThreadCurrentUICulture.

Например:

var frenchCulture = new CultureInfo("fr-FR"); 

Thread.CurrentThread.CurrentCulture = frenchCulture; 
Thread.CurrentThread.CurrentUICulture = frenchCulture; 
CultureInfo.DefaultThreadCurrentCulture = frenchCulture; 
CultureInfo.DefaultThreadCurrentUICulture = frenchCulture; 

Это должно быть сделано в Main метод вашей программы, до загрузки любых форм и до Application.Run называется.

Из MSDN, относительно настройки по умолчанию культуры в потоке пользовательского интерфейса:

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

+0

Значение всплывающей подсказки не может быть изменено динамически во время выполнения после создания компонента. Becase значение извлекается в конструкторе на основе культуры в момент создания кнопки. –

+0

Его не нужно вызывать в основном методе. Достаточно назвать это, прежде чем показывать форму. Тогда форма будет использовать 'Thread.CurrentThread.CurrentUICulture', поскольку это культура ui. Кроме того, здесь устанавливаются другие свойства, чем «CurrentUICulture». –

Смежные вопросы