2009-05-25 57 views
1

我有一個UserControl顯示UserControl的DP的一些文本。爲此使用了一個轉換器。我知道文化參數是「en-US」文化,除非您在綁定的ConverterCulture值或xml:lang屬性中指定不同的文化。如何更改Converter的CultureInfo?

但是,我怎樣才能改變從用戶的外部文化?

這是我的用戶:

<UserControl x:Class="CultInfoConverter.MyUserControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:my="clr-namespace:CultInfoConverter" 
    DataContext="{Binding RelativeSource={RelativeSource Self}}" 
    Tag="{x:Null}"> 
    <UserControl.Resources> 
     <my:MyConverter x:Key="MyConverter" /> 
    </UserControl.Resources> 
    <StackPanel Orientation="Horizontal" > 
     <TextBlock Margin="8">My converter culture is</TextBlock> 
     <TextBlock FontWeight="Bold" Text="{Binding Tag, Converter={StaticResource MyConverter}}" /> 
    </StackPanel> 
</UserControl> 

出於演示的目的,轉換器僅返回傳遞給它的文化信息名稱:

public class MyConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return culture.Name; 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

在我的窗口,我有用戶的兩個實例控制,並且每個人都應該展示不同的文化。但都顯示標準的「美國」。

<Window x:Class="CultInfoConverter.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300" 
    xmlns:my="clr-namespace:CultInfoConverter"> 
    <StackPanel> 
     <TextBlock Margin="8">using xml:lang="de-DE"</TextBlock> 
     <my:MyUserControl xml:lang="de-DE"/> 
     <TextBlock Margin="8">using xml:lang="fr-FR"</TextBlock> 
     <my:MyUserControl xml:lang="fr-FR"/> 
    </StackPanel> 
</Window> 

回答

3

之所以你的例子不工作是,你設置的xml:MyUserObject後郎財產已經被構造。 TextBlock(以及綁定和轉換器)已經創建了w /默認語言,即en-US。

TheDuke對多個xml:lang屬性不正確。雖然這是真的,但只有1個UI線程,並且它只有1種文化,each FrameworkElements is allowed it's own xml:lang。要測試這一點,請在您的MyUserControl XAML(在您的第一個代碼清單中)中將xml:lang屬性設置爲de-DE。你應該看到DE-DE現在出現了兩次粗體。

爲了解決這個問題,你必須建立在數據綁定的MyUserControl已建成和語言/ xml:lang屬性已設置。我通過在MyUserControl的Loaded事件中添加DataBinding做了一個快速測試。這給你我期望的結果(第一行DE-DE,第二行DE-FR)。

alt text http://img35.imageshack.us/img35/4588/howtochangetheculturein.png

MyControl XAML上市:

<UserControl 
    x:Class="WPFCultureTester.MyUserControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:WPFCultureTester" 
    DataContext="{Binding RelativeSource={RelativeSource Self}}" 
    Tag="{x:Null}" 
    Loaded="UserControl_Loaded"> 
    <StackPanel Orientation="Horizontal" > 
     <TextBlock Margin="8">My converter culture is</TextBlock> 
     <TextBlock x:Name="foo" FontWeight="Bold" /> 
    </StackPanel> 
</UserControl> 

MyControl代碼隱藏:

using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 

namespace WPFCultureTester 
{ 
    /// <summary> 
    /// Interaction logic for MyUserControl.xaml 
    /// </summary> 
    public partial class MyUserControl : UserControl 
    { 
     public MyUserControl() 
     { 
      InitializeComponent(); 
     } 

     private void UserControl_Loaded(object sender, RoutedEventArgs e) 
     { 
      this.foo.SetBinding(
       TextBlock.TextProperty, 
       new Binding("") { Converter = CultInfoConverter.Converter }); 
     } 
    } 
} 

順便說一句,我把增加一個單轉換器到CultInfoConverter和重命名一些名字空間的自由,所以你可能不得不將它改回來,如果你正在做直剪/粘貼。

0

我不是全球化的專家,事實上我不認爲我曾經嘗試過,但希望這有助於。

這裏是我的UserControl.xaml

<UserControl x:Class="Tab_Question.UserControl1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Height="30"> 
<Grid> 
    <TextBlock Text="{Binding Path=CultureName, FallbackValue=bindingError}" /> 
</Grid> 

繼承人UserControl.cs

public partial class UserControl1 : UserControl 
{ 
    public static DependencyProperty CultureStringProperty = 
     DependencyProperty.RegisterAttached("Culture", typeof(String), typeof(UserControl1)); 

    public static DependencyProperty CultureNameProperty = 
     DependencyProperty.Register("CultureName", typeof(String), typeof(UserControl1)); 

    public String CultureString 
    { 
     get 
     { 
      return (String)GetValue(UserControl1.CultureStringProperty); 
     } 
     set 
     { 
      if (CultureString != value) 
      { 
       SetValue(UserControl1.CultureStringProperty, value); 
       DoSomethingWithCulture(); 
      } 
     } 
    } 

    private void DoSomethingWithCulture() 
    { 
     // Good to continue 
     CultureInfo newCulture = CultureInfo.GetCultureInfo(CultureString); 
     SetValue(UserControl1.CultureNameProperty, newCulture.Name); 
    } 

    public UserControl1() 
    { 
     InitializeComponent(); 
     this.DataContext = this; 
    } 
} 

最後繼承人後面的代碼Window.xaml

<Window 
x:Class="Tab_Question.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="clr-namespace:Tab_Question" 
Title="Window1" Height="300" Width="300"> 
<StackPanel> 
    <local:UserControl1 CultureString="en-us" /> 
    <local:UserControl1 CultureString="en-gb" /> 
</StackPanel> 

我會試着解釋我所做的,希望它能回答這個問題。

我已經在UserControl上設置了附加的DependencyProperty,它允許您在更新字符串時將CultureInfo字符串傳遞給UserControl UserControl創建一個CultureInfo對象,您可以將其存儲在成員變量中,並更新CultureName DependancyProperty UserControl中的TextBlock綁定到。

我不確定爲什麼設置您嘗試的XmlLang屬性不起作用,但懷疑它與只能使用一種語言的UI線程有關。

我知道這與您提供的示例代碼不匹配,但我希望它能爲您提供修改和適應的起點。

+0

好吧,這種幫助,但我想爲我的UserControl中使用的Converter對象使用不同的文化。 我可以將用戶控件本身作爲轉換器參數,然後從ConvertTo函數中獲取DP。但我寧願不使用任何轉換器參數。 – miasbeck 2009-05-25 13:55:39

+0

如果您可以設法將CultureInfo存儲在靜態會員變量,那麼你可以使用它來爲轉換器提供不同的文化。 – TheDuke 2009-05-25 17:56:39

相關問題