2011-02-02 15 views
1

デザインタイムのローカリゼーションを実行しようとしていますXamlのウィンドウで、ラベルを自動的に変更して適切な言語でラベルを表示する言語と言語のコントロールを選択するプロパティが必要です。WPF添付プロパティ

言語シンボル(LANG_SURNAMEまたはLANG_FORENAMEなど)を含むLanguageLabelで、アタッチされたプロパティ(LanguageMarkupProperty)の内容を取得すると、ラベルのテキストが検索され、指定された言語で検索されます。これまでのところ私は、コンテンツコントロールから派生するオブジェクトを作成しました:

public class LanguageLabel : ContentControl 
{ 
    public LanguageLabel() 
    { 
     EventManager.RegisterClassHandler(typeof(Window), 
              DisplayLanguage.LanguageChangedEvent, 
              new RoutedEventHandler(this.ChangeLanguage)); 

     this.Loaded += new RoutedEventHandler(LanguageLabel_Loaded); 
    } 

    ~LanguageLabel() 
    { 
    } 

    // Walk up the visual tree to find the top level object. 
    private DependencyObject FindUpVisualTree(DependencyObject initial) 
    { 
     DependencyObject current = initial; 
     DependencyObject last = current; 

     while (current != null) 
     { 
      last = current; 
      current = VisualTreeHelper.GetParent(current); 
     } 

     return last; 
    } 

    void LanguageLabel_Loaded(object sender, RoutedEventArgs e) 
    { 
     object root = FindUpVisualTree(this); 

     UIElement window = root as UIElement; 
     PossibleLanguages ?language = null; 
     if (window != null) 
      language = (PossibleLanguages)window.GetValue(DisplayLanguage.DisplayLanguageProperty); 
     if (language == null) language = PossibleLanguages.UKEnglish; 

     string languageSymbol = GetValue(LanguageMarkup.LanguageMarkupProperty) as string; 

     this.Content = Language.Translate(languageSymbol, language); 

    } 

    public void ChangeLanguage(object sender, RoutedEventArgs e) 
    { 
     LanguageChangedEventArgs le = e as LanguageChangedEventArgs; 

     string languageSymbol = GetValue(LanguageMarkup.LanguageMarkupProperty) as string; 

     this.Content = Stanley.Language.Translate(languageSymbol, (PossibleLanguages)le.DependencyPropertyChangedEventArgs.NewValue); 
    } 


} 

はまた、私は、XAMLでウィンドウの上に置いています添付プロパティという名前の表示言語を作成しました。

public class DisplayLanguage 
{ 
    public static readonly DependencyProperty DisplayLanguageProperty; 

    public static void SetDisplayLanguage(UIElement element, PossibleLanguages value) 
    { 
     element.SetValue(DisplayLanguageProperty, value); 
    } 

    public static PossibleLanguages GetDisplayLanguage(UIElement element) 
    { 
     return (PossibleLanguages)element.GetValue(DisplayLanguageProperty); 
    } 

    static DisplayLanguage() 
    { 
     DisplayLanguageProperty = DependencyProperty.RegisterAttached(
          "DisplayLanguage", 
          typeof(PossibleLanguages), 
          typeof(WindowBase), 
          new FrameworkPropertyMetadata(PossibleLanguages.UKEnglish, FrameworkPropertyMetadataOptions.AffectsRender ,new PropertyChangedCallback(OnDisplayLanguageChanged)) 
          ); 

    } 


    public static void AddReceiver(object receiver, RoutedEventHandler e) 
    { 
    } 

    public static void OnDisplayLanguageChanged(DependencyObject control, DependencyPropertyChangedEventArgs e) 
    { 
     // Fire an event to tell the LanguageLabel controls to update to the new language. 
    } 

} 

私は何とかそれが設計時にその表示を更新するために、すべての言語のコントロールを伝えるイベントを発生させるOnDisplayLanguageChangedたいと思います。誰も私がどのようにこれをacheievできますか知っていますか?

+0

「デザインタイムローカリゼーション」とはどういう意味ですか? – NVM

+0

私は、VS IDEのxamlレンダリング者であることを意味します。 –

+0

間違ったキーです。再試行する。 VS2010のデザインタイムレンダリングでは、適切な言語変換が施されたラベルが表示されます。 –

答えて

0

EventAggregator in PrismまたはMessanger in MVVMLightのようなものを使用して、すべての言語コントロールが登録できるイベントをブロードキャストできます。

これらのフレームワークを使用したくない場合は、このパターンの独自の実装を作成するのは簡単です。

+0

LanguageLabelsがロードされたときに登録するイベントを使用して、独自のソリューションを作成しました。治療をしなさい。 –

関連する問題