2009-06-14 2 views
6

- 私:WPF:このようなWPFアプリケーションで国際化された文字列をロードするためのmarkupextensionを使用して値の動的MarkupExtension-再描画/更新

<Button Content="{Translate MyText}"/> 

マイmarkupextensionは「TranslateExtension」と命名され、それが値を検索しますデータベースからのキー "MyText"。

ProvideValue(IServiceProvider serviceProvider) 

正しい文字列を返すメソッドです。すべてがうまくいきます。

私の問題は、ProvideValueメソッドが再び呼び出されることはなく、言語が変更されたときにデータベースから新しい文字列を取得する方法がないことです。戻り値を「動的」にして、ボタンをxamlにリロードし、言語変更などのイベントをスローするかどうかにかかわらず、マークアップ拡張機能を再利用する方法が必要です。システムでProvideValue-Methodをもう一度呼び出すにはどうしたらいいですか?私は好きなものを試しました InvalidateVisual()InvalidateArrange()InvalidateMeasure()UpdateLayout()...

私は自分自身を明確にしたいと思います。あなたがアイデアや解決策を提供できると思っていることについて、より多くの情報を求めてください。 はおそらく、あなたが翻訳を行うにはIValueConverterと組み合わせるバインディングを使用して検討することもでき

...私はあなたのための答えではなく、提案を持っていないあなたに

+0

同じPROBは... – santa

答えて

-1

ありがとうございます。次に、ユーザーインターフェイスの言語が変更された場合は、すべてのバインディングを再帰的に繰り返して更新することができます。

私が言ったように、単なるアイデアです。

+0

こんにちはマーク、 はあなたの提案をありがとうございました。私はバインディングを使用して見ているだろうが、私の場合は動作しない可能性があります。すべてが少し難しく、私は必要なものを簡略化しました。事は、私は言語を別々にすべてのフォームのために作ることができますし、フォームが選択された言語を持っていない場合、それは標準言語に依存することになります(変更することもできます)。 xamlがレンダリングされた後にマークアップ拡張が公開されていることがわかりました(まだどこかの参照がある場合を除いて)。私は現在バブルとトンネルイベントを試みており、フォームにハンドラを登録しています。 –

+0

しかし、私はパフォーマンスとメモリの問題を評価する必要があります。とにかく、どこにいても "実際にフォームをリロード"しないようです。 –

4

まあ、解決策はかなり簡単です。

ProvideValueは一度だけ呼び出されますが、serviceProviderパラメータはオブジェクトインスタンスとプロパティ(PropertyInfo)も提供します。これは後で性格を更新するために必要なすべてです。

私はApp.csで静的イベントを作成します。たとえば、CultureChangedとしましょう。 ProvideValueメソッドでオブジェクトのインスタンスとプロパティを取得し、それらを格納します。 CultureChangedイベントにアタッチし、そのEventHandlerでリフレクションを使用してプロパティ値を設定します。それだけで、メモリリークには注意してください。このアプローチを使用し、その場でキャッシュ文化にできますMarkupExtensionあり

:ここ http://www.codeproject.com/KB/WPF/WpfMultiLanguage.aspx

関連する問題