C# 多语言绑定项资源
我想将我的单语言项目更改为多语言项目,因此我使用ResourceDictionary这样做:C# 多语言绑定项资源,c#,wpf,localization,C#,Wpf,Localization,我想将我的单语言项目更改为多语言项目,因此我使用ResourceDictionary这样做: public class SelectableViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName = null) {
public class SelectableViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName = null)
{
var handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
private bool _isSelected;
public bool IsSelected
{
get { return _isSelected; }
set
{
if (_isSelected == value) return;
_isSelected = value;
OnPropertyChanged();
}
}
private char _code;
public char Code
{
get { return _code; }
set
{
if (_code == value) return;
_code = value;
OnPropertyChanged();
}
}
private string _name;
public string Name
{
get { return _name; }
set
{
if (_name == value) return;
_name = value;
OnPropertyChanged();
}
}
private string _description;
public string Description
{
get { return _description; }
set
{
if (_description == value) return;
_description = value;
OnPropertyChanged();
}
}
}
XAML
<Button Content="{DynamicResource LanguageSetting}" Click="btn_LanguageSetting_Click"/>
这对我来说很好。但是我有一个ItemsControl
<ItemsControl ItemsSource="{Binding ItemOperate}">
<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type viewmodel:SelectableViewModel}">
<Border x:Name="Border" Padding="0,8,0,8" BorderThickness="0 0 0 1" BorderBrush="{DynamicResource MaterialDesignDivider}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="Checkerz" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<ToggleButton VerticalAlignment="Center" IsChecked="{Binding IsSelected}"
Style="{StaticResource MaterialDesignActionLightToggleButton}"
Content="{Binding Code}" />
<StackPanel Margin="8 0 0 0" Grid.Column="7">
<TextBlock FontWeight="Bold" Text="{Binding Name}" />
<TextBlock Text="{Binding Description}" />
</StackPanel>
</Grid>
</Border>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding IsSelected}" Value="True">
<Setter TargetName="Border" Property="Background" Value="{DynamicResource MaterialDesignSelection}" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
及
public主视图模型()
{
_itemOperate=CreateData();
}
私有静态ObservableCollection CreateData()
{
返回新的ObservableCollection
{
新的SelectableViewModel
{
代码='E',
Name=“擦除”,
Description=“逐页擦除MCU芯片”
},
新的SelectableViewModel
{
代码='D',
Name=“检测”,
Description=“检测MCU闪存”,
},
新的SelectableViewModel
{
代码='P',
Name=“编程”,
Description=“通过十六进制文件编程MCU芯片”,
},
新的SelectableViewModel
{
代码='V',
Name=“验证”,
Description=“验证Downing代码”,
},
新的SelectableViewModel
{
Code='L',
Name=“Lock”,
Description=“锁定代码以保护MCU”,
}
};
}
那么我应该如何将其转换为多种语言呢?首先,我建议您更改本地化引擎。 有很多不同的方法。 有一个最简单的变体: 此外,此工具将帮助您管理资源文件: 你的问题的答案是: 如果您想本地化您的模型,您应该使用参考资料字典而不是硬编码字符串来创建它。 如果您像前面提到的那样实现本地化引擎,这是非常容易的 文章
{
return new ObservableCollection<SelectableViewModel>
{
new SelectableViewModel
{
Code = 'E',
Name = YourResourcesProject.Resources.Erase,
Description = YourResourcesProject.Resources.EraseTheMCUChipByPage
},
new SelectableViewModel
{
Code = 'D',
Name = YourResourcesProject.Resources.Detect,
Description = YourResourcesProject.Resources.DetectTheMCUFlash
},
new SelectableViewModel
{
Code = 'P',
Name = YourResourcesProject.Resources.Programming,
Description = YourResourcesProject.Resources.ProgrammingTheMCUChipByHexFile
},
new SelectableViewModel
{
Code = 'V',
Name = YourResourcesProject.Resources.Verify,
Description = YourResourcesProject.Resources.VerifyTheDowningCode
},
new SelectableViewModel
{
Code ='L',
Name = YourResourcesProject.Resources.Lock,
Description = YourResourcesProject.Resources.LockTheCodeToProtectTheMCU
}
};
{
返回新的ObservableCollection
{
新的SelectableViewModel
{
代码='E',
Name=YourResourcesProject.Resources.Erase,
Description=您的资源project.Resources.EraseTheMCUChipByPage
},
新的SelectableViewModel
{
代码='D',
Name=YourResourcesProject.Resources.Detect,
Description=YourResourcesProject.Resources.DetectTheMCUFlash
},
新的SelectableViewModel
{
代码='P',
Name=YourResourcesProject.Resources.Programming,
Description=yoursourcesproject.Resources.ProgrammingTheMCUChipByHexFile
},
新的SelectableViewModel
{
代码='V',
Name=YourResourcesProject.Resources.Verify,
Description=您的资源project.Resources.verifythedowning代码
},
新的SelectableViewModel
{
Code='L',
Name=YourResourcesProject.Resources.Lock,
Description=您的资源project.Resources.lock密码保护CU
}
};
}首先,我建议您更改本地化引擎。 有很多不同的方法。 有一个最简单的变体: 此外,此工具将帮助您管理资源文件: 你的问题的答案是: 如果您想本地化您的模型,您应该使用参考资料字典而不是硬编码字符串来创建它。 如果您像前面提到的那样实现本地化引擎,这是非常容易的 文章
{
return new ObservableCollection<SelectableViewModel>
{
new SelectableViewModel
{
Code = 'E',
Name = YourResourcesProject.Resources.Erase,
Description = YourResourcesProject.Resources.EraseTheMCUChipByPage
},
new SelectableViewModel
{
Code = 'D',
Name = YourResourcesProject.Resources.Detect,
Description = YourResourcesProject.Resources.DetectTheMCUFlash
},
new SelectableViewModel
{
Code = 'P',
Name = YourResourcesProject.Resources.Programming,
Description = YourResourcesProject.Resources.ProgrammingTheMCUChipByHexFile
},
new SelectableViewModel
{
Code = 'V',
Name = YourResourcesProject.Resources.Verify,
Description = YourResourcesProject.Resources.VerifyTheDowningCode
},
new SelectableViewModel
{
Code ='L',
Name = YourResourcesProject.Resources.Lock,
Description = YourResourcesProject.Resources.LockTheCodeToProtectTheMCU
}
};
{
返回新的ObservableCollection
{
新的SelectableViewModel
{
代码='E',
Name=YourResourcesProject.Resources.Erase,
Description=您的资源project.Resources.EraseTheMCUChipByPage
},
新的SelectableViewModel
{
代码='D',
Name=YourResourcesProject.Resources.Detect,
Description=YourResourcesProject.Resources.DetectTheMCUFlash
},
新的SelectableViewModel
{
代码='P',
Name=YourResourcesProject.Resources.Programming,
Description=yoursourcesproject.Resources.ProgrammingTheMCUChipByHexFile
},
新的SelectableViewModel
{
代码='V',
Name=YourResourcesProject.Resources.Verify,
Description=您的资源project.Resources.verifythedowning代码
},
新的SelectableViewModel
{
Code='L',
Name=YourResourcesProject.Resources.Lock,
Description=您的资源project.Resources.lock密码保护CU
}
};
}不要更改任何内容…将您的SelectableViewModel集合转换为XML并更改CreateData以将其加载到本地化版本-您可以为每种语言创建一个文件,也可以将其混合在一起不要更改任何内容…将您的SelectableViewModel集合转换为XML并更改CreateData以将其加载到本地化版本中本地化版本-您可以为每种语言创建一个文件,也可以将所有代码混合在一起20行……如您所愿-最明确的是:-(
公共类可选(视图)模型
{
[XmlAttribute]
公共字符串代码{get;set;}
[XmlAttribute]
公共字符串名称{get;set;}
[XmlAttribute]
公共字符串说明{get;set;}
}
///可以直接反序列化视图模型
私有ObservableCollection CreateData()
{
返回新的ObservableCollection(反序列化(文件名、代码、SelectableViewModel));
}
//或者参加一个模型课
私有ObservableCollection CreateData()
{
返回新的ObservableCollection(反序列化(文件名、代码、SelectableModel);
}
静态公共对象
{
return new ObservableCollection<SelectableViewModel>
{
new SelectableViewModel
{
Code = 'E',
Name = YourResourcesProject.Resources.Erase,
Description = YourResourcesProject.Resources.EraseTheMCUChipByPage
},
new SelectableViewModel
{
Code = 'D',
Name = YourResourcesProject.Resources.Detect,
Description = YourResourcesProject.Resources.DetectTheMCUFlash
},
new SelectableViewModel
{
Code = 'P',
Name = YourResourcesProject.Resources.Programming,
Description = YourResourcesProject.Resources.ProgrammingTheMCUChipByHexFile
},
new SelectableViewModel
{
Code = 'V',
Name = YourResourcesProject.Resources.Verify,
Description = YourResourcesProject.Resources.VerifyTheDowningCode
},
new SelectableViewModel
{
Code ='L',
Name = YourResourcesProject.Resources.Lock,
Description = YourResourcesProject.Resources.LockTheCodeToProtectTheMCU
}
};
public class Selectable(View)Model
{
[XmlAttribute]
public string Code { get; set; }
[XmlAttribute]
public string Name { get; set; }
[XmlAttribute]
public string Description { get; set; }
}
///you can deserialize your view model directly
private ObservableCollection<SelectableViewModel> CreateData()
{
return new ObservableCollection<SelectableViewModel>( Deserialize( file_name_code_lang.xml, SelectableViewModel) );
}
// or going through a model class
private ObservableCollection<SelectableViewModel> CreateData()
{
return new ObservableCollection<SelectableViewModel>( Deserialize( file_name_code_lang.xml, SelectableModel ).Foreach(p=> new SelectableViewModel(p) );
}
static public object Deserialize(string filePath, Type objType)
{
object objToDeserialize = null;
XmlTextReader xmlReader = null;
XmlSerializer xmls = null;
try
{
xmlReader = new XmlTextReader(filePath);
xmls = new XmlSerializer(objType);
objToDeserialize = xmls.Deserialize(xmlReader);
}
catch (Exception err)
{
BusinessLogger.Manage(err);
return null;
}
finally
{
xmls = null;
xmlReader.Close();
}
return objToDeserialize;
}