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,但在尝试之后,我发现这不是正确的方法。
我想,我必须访问我的组合框中的每个项目到视觉孩子,并在那里更改 textblock 的 text到翻译版本。
但不知道如何 - 或者是否有更简单的方法?
在尝试了很多事情之后,我在昨天早上找到了解决方案。
最好不要只存颜色
默认颜色不包括名称和值以外的其他内容。
因此我写了一个 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)需要做更多的工作,但我认为这是本地化颜色和存储正确的英文名称以便在应用程序中使用的好方法。
我想本地化组合框颜色选择器的颜色。
我知道,我必须手动翻译颜色名称。
我想你需要知道,我是如何填充我的组合框并显示数据的。
这是我的 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,但在尝试之后,我发现这不是正确的方法。
我想,我必须访问我的组合框中的每个项目到视觉孩子,并在那里更改 textblock 的 text到翻译版本。
但不知道如何 - 或者是否有更简单的方法?
在尝试了很多事情之后,我在昨天早上找到了解决方案。
最好不要只存颜色
默认颜色不包括名称和值以外的其他内容。
因此我写了一个 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)需要做更多的工作,但我认为这是本地化颜色和存储正确的英文名称以便在应用程序中使用的好方法。