2016-07-13 14 views
2

Ich habe eine erweiterte Button-Klasse wie folgt;Schaltfläche Tooltip nicht lokalisiert werden

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

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

In obigem Code 'StringResources.MyLocalizedTooltipString' enthält Strings für verschiedene Sprachen. Aber wenn ich die Thread-Kultur ändere, wird der Tooltip-Text nicht geändert. Wie erreiche ich das? Jede Hilfe wäre willkommen.

+0

Können Sie uns zeigen, wie Sie die Fadenkultur ändern? –

Antwort

2

Es ist normal. SetToolTip Methode akzeptiert String und es wird der Text angezeigt, der aus der Ressource basierend auf der aktuellen Kultur beim Aufruf SetToolTip abgerufen und die Kultur zur Laufzeit ändern wird keine Auswirkungen auf sie haben. Also hier, da die Einstellung Tooltip im Konstruktor Ihrer Schaltfläche ausgeführt wird, wird die Kultur des Threads in diesem Moment verwendet.

Wenn Sie Ihren Tooltip wollen dynamisch die aktuelle Kultur verwenden automatially, als Option können Sie einen Dummy-Text als Tooltip gesetzt (den Tooltip zu ermöglichen) und dann Handhabung Popup Fall Tooltip, weisen Sie den lokalisierten Wert auf den Tooltip:

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); 
    } 
} 

Hinweis: Wenn Ihr Ziel ist die Tooltip nicht machen dynamisch lokalisierbar ist und Sie nur eine lokalisierbare Tooltip, die Art und Weise Localizable Eigenschaft Form Werke, um Designer Ihrer ExtendedButton Komponente gehen und setzen Localizable Eigenschaft auf true und dann verwenden verschiedene Tooltip-Texte für verschiedene Anwendungen.

Denken Sie jedoch daran, dass der Wert zur Laufzeit nicht dynamisch geändert werden kann, nachdem die Komponente erstellt wurde.

Hier ein Beispiel:

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

Lassen Sie mich wissen, wenn Sie Fragen zur Antwort haben. Ich habe die Codes getestet und die dynamische Laufzeitumgebung funktioniert ordnungsgemäß mit diesen Änderungen in der Komponente. Um zu testen, ist es genug, um StringResources.resx und eine andere, zum Beispiel StringResources.fa-IR.resx und zeigen Sie ein Formular mit der Schaltfläche. Ändern Sie dann zur Laufzeit die 'CurrentUICulture' und sehen Sie sich das Ergebnis an. –

+0

Danke! Das funktioniert perfekt. –

+0

Gern geschehen :) Hoffentlich hast du es verstanden. –

0

Um die Kultur umfassend zu setzen, müssen Sie die CurrentCulture und CurrentUICulture für den aktuellen Thread setzen, und wenn Sie irgendwelche neuen Threads in Ihrer Anwendung erstellen gehen, die DefaultThreadCurrentCulture und DefaultThreadCurrentUICulture.

Zum Beispiel:

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

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

Dies sollte in Ihrem Programm Main Methode durchgeführt werden, bevor jegliche Form geladen werden und vor Application.Run genannt wird.

Von MSDN, in Bezug auf die Kultur Standard-Thread UI Einstellung:

Es sei denn, es ausdrücklich festgelegt ist, wird der Wert der DefaultThreadCurrentUICulture Eigenschaft ist null, und die aktuelle Kultur aller Threads in einer Anwendungsdomäne, die nicht hat Wurde eine explizite Kultur zugewiesen, wird diese durch die Standard-Windows-Systemkultur definiert.

+0

Der Tooltippwert kann zur Laufzeit nicht dynamisch geändert werden, nachdem die Komponente erstellt wurde. Beachte, dass der Wert im Konstruktor basierend auf der Kultur in dem Moment extrahiert wird, in dem die Schaltfläche erstellt wurde. –

+0

Es muss nicht in der Hauptmethode aufgerufen werden. Es reicht aus, es anzurufen, bevor ein Formular angezeigt wird. Dann wird das Formular "Thread.CurrentThread.CurrentUICulture" verwenden, da es sich um eine eigene Kultur handelt. Andere Eigenschaften als 'CurrentUICulture' zu ​​setzen, ist hier nicht sinnvoll. –