WPF 本地化颜色选择器组合框

WPF localizabled color picker combobox

我想本地化组合框颜色选择器的颜色。

我知道,我必须手动翻译颜色名称。

我想你需要知道,我是如何填充我的组合框并显示数据的。

这是我的 xaml 组合框和项目模板:

<ComboBox x:Name="cmbxFarbeKategorie" Margin="5,0,0,0" Height="40" FontSize="18"
     SelectionChanged="cmbxFarbeKategorie_SelectionChanged">
<ComboBox.ItemTemplate>
      <DataTemplate>
           <DockPanel LastChildFill="False" Margin="0,0,10,0">
               <Rectangle VerticalAlignment="Center" Fill="{Binding Name}" Width="16" Height="16" Margin="0,2,5,2" />
               <TextBlock x:Name="tbDataTempcmbx"  VerticalAlignment="Center" Tag="{Binding Name}" Text="{Binding Name}" />
           </DockPanel>
      </DataTemplate>
</ComboBox.ItemTemplate>

并且在运行时我用 .net 中的默认定义颜色名称填充一次:

foreach (var col in typeof(Colors).GetProperties())
{
      cmbxFarbeKategorie.Items.Add(col);
}

现在我需要一种方法来访问每个项目的 VisualTree 并将文本的绑定替换为翻译后的颜色。

翻译方法(用这个one)返回一个字符串

我不想重命名颜色,我只想替换显示的文字。

我的问题是,我知道如何访问 ItemTemplate 中的 TextBlock,但在尝试之后,我发现这不是正确的方法。

我想,我必须访问我的组合框中的每个项目到视觉孩子,并在那里更改 textblocktext到翻译版本。

但不知道如何 - 或者是否有更简单的方法?

在尝试了很多事情之后,我在昨天早上找到了解决方案。
最好不要只存颜色

默认颜色不包括名称和值以外的其他内容。
因此我写了一个 class 来将这些颜色添加到组合框。 结束于为标签创建一个字符串,一个用于名称和一个颜色。

如果我想本地化名称,名称和颜色不会更新。
Tag-Property 仅用于将本地化名称存储在某处,并且可以将我的 Text-Property 绑定到英语默认名称(存储在 Name-Property 中)之外的另一个值。

我不想更新名称 属性,因为这会导致双向多次转换,这不是一个好方法。

第 1 步 - 创建自己的 Class 来存储颜色:

 public class ColorItem
{
    public string Tag
    {
        get;
        set;
    }

    public string Name
    {
        get;
        set;
    }

    public Color Color
    {
        get;
        set;
    }
}

第二步是更新我的 foreach-loop:

如果系统语言不是英语(我在开始时检查了一次 应用程序并存储它),然后我用翻译后的名称更新项目的 Tag-Property。

foreach (var col in typeof(Colors).GetProperties())
{
     string strColor = col.ToString().Replace("System.Windows.Media.Color ", "");
         string strTag = "";
         switch (iSystemLanguage)
         {
         case 0:
             strTag = strColor;
             break;
        case 1:
             drawg.Color drawingcolor = drawg.Color.FromName(strColor);
             strTag = GetGerManColorNames.GetGermanName(drawingcolor);
             break;
        default:
             strTag = strColor;
             break;
       }
       cmbxFarbeKategorie.Items.Add(new ColorItem() { Name = strColor, Tag = 
                strTag, Color = (Color)ColorConverter.ConvertFromString(strColor) });
    }

在最后一步,我不得不在我的组合框中更新我的绑定:

<ComboBox x:Name="cmbxFarbeKategorie" Margin="5,0,0,0" Height="40" FontSize="18"
 SelectionChanged="cmbxFarbeKategorie_SelectionChanged">
<ComboBox.ItemTemplate>
      <DataTemplate>
           <DockPanel LastChildFill="False" Margin="0,0,10,0">
               <Rectangle VerticalAlignment="Center" Fill="{Binding Name}" 
                               Width="16" Height="16" Margin="0,2,5,2" />
               <TextBlock x:Name="tbDataTempcmbx"  VerticalAlignment="Center" 
                                 Tag="{Binding Name}" Text="{Binding Tag}" />
           </DockPanel>
    </DataTemplate>
</ComboBox.ItemTemplate>
 </ComboBox>

获取 SelectedItem(对于 example:at SelectionChanged)需要做更多的工作,但我认为这是本地化颜色和存储正确的英文名称以便​​在应用程序中使用的好方法。