2016-07-13 5 views
2

次のような拡張ボタンクラスがあります。ボタンのツールチップがローカライズされない

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

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

上記のコードでは、 'StringResources.MyLocalizedTooltipString'にはさまざまな言語の文字列が含まれています。しかし、スレッドカルチャを変更すると、ツールヒントのテキストが変更されません。それを達成する方法? ご協力いただければ幸いです。

+0

スレッドカルチャーをどのように変更することができますか? –

答えて

2

これは正常です。 SetToolTipメソッドは文字列を受け入れ、SetToolTipを呼び出すときに現在のカルチャに基づいてリソースから抽出したテキストを表示し、実行時にカルチャを変更しても影響はありません。 ボタンのコンストラクタでツールヒントを設定すると、その時点のスレッドのカルチャが使用されます。

あなたのツールヒントが動的にあなたが(ツールチップを有効にする)ツールチップとしてダミーテキストを設定し、ツールチップのPopupイベントを処理する、ツールヒントにローカライズされた値を割り当てることができ、オプションとして、automatially現在のカルチャを使用する場合:

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

注:あなたの目標は、動的にローカライズツールチップを作っていないとあなただけのローカライズツールチップ、Form作品のLocalizableプロパティは、あなたのExtendedButtonコンポーネントのデザイナーに移動し、trueLocalizableプロパティを設定し、使用方法をしたい場合異なる仲間のための異なるツールチップテキスト。

ただし、コンポーネントが作成された後、実行時に値が変更されることはありません。ここで

は一例です。

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

答えについて質問がある場合はお知らせください。私はコードをテストし、実行時の動的なローカライゼーションは、コンポーネントの変更を使用して正しく機能します。テストするには、StringResources.resxともう1つ、たとえばStringResources.fa-IR.resxを用意し、ボタンを含むフォームを表示するだけで十分です。次に、実行時に 'CurrentUICulture'を変更し、結果を確認します。 –

+0

ありがとう!これは完全に機能します。 –

+0

あなたは歓迎です:)あなたはポイントを持っていることを願っています。 –

0

を総合文化を設定するには、現在のスレッドのCurrentCultureCurrentUICultureを設定する必要があり、あなたはあなたのアプリケーション内の任意の新しいスレッドを作成するつもりなら、 DefaultThreadCurrentCultureおよびDefaultThreadCurrentUICulture。例えば

:任意のフォームがロードされる前とApplication.Runが呼び出される前に

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

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

これは、あなたのプログラムのMain方法で行う必要があります。デフォルトのスレッドのUIカルチャ設定に関するMSDNから

、:

それが明示的に設定されていない限り、DefaultThreadCurrentUICultureプロパティの値がnullではなく、持っているアプリケーションドメイン内のすべてのスレッドの現在のカルチャ明示的なカルチャが割り当てられているかどうかは、既定のWindowsシステムカルチャによって定義されます。

+0

コンポーネントが作成された後、実行時にツールヒント値を動的に変更することはできません。その値が、ボタンが作成された瞬間の文化に基づいてコンストラクタで抽出されるようにします。 –

+0

mainメソッドで呼び出す必要はありません。フォームを表示する前にそれを呼び出すだけで十分です。その後、フォームは 'Thread.CurrentThread.CurrentUICulture'をUI文化として使用します。また、CurrentUICultureよりも他のプロパティを設定することはここでポイントレスです。 –

関連する問題