是否有任何方法为本地化扩展全局分配默认值
本文关键字:扩展 全局 分配 默认值 本地化 任何 方法 是否 | 更新日期: 2023-09-27 18:12:56
问题陈述是,我在所有视图中复制并粘贴了以下xaml行块。
lex:LocalizeDictionary.DesignCulture="en"
lex:ResxLocalizationProvider.DefaultAssembly="WPF.Common"
lex:ResxLocalizationProvider.DefaultDictionary="global"
xmlns:lex="http://wpflocalizeextension.codeplex.com">
是否有一些机制,把这个分配在一些文件和派生在所有视图?
您可以使用附加行为,这里是非常简单的(哑)版本:
public class MyBevavior
{
public static bool GetProperty(DependencyObject obj) => (bool)obj.GetValue(PropertyProperty);
public static void SetProperty(DependencyObject obj, bool value) => obj.SetValue(PropertyProperty, value);
public static readonly DependencyProperty PropertyProperty =
DependencyProperty.RegisterAttached("Property", typeof(bool), typeof(Class), new PropertyMetadata(false, (d, e) =>
{
LocalizeDictionary.SetDesignCulture(d, "en");
ResxLocalizationProvider.SetDefaultAssembly(d, "WPF.Common");
ResxLocalizationProvider.SetDefaultDictionary(d, "global")
}));
}
然后xaml变成缩短:
<Window local:MyBehavior.Property="true" ...>
...
注意,您可以使用一些有意义的参数使其可配置。当前的形式是bool
,这是愚蠢的,也许将en
传递为string
是有意义的。
或者你可以为你所有的视图创建基本类型,例如MyWindow
,你在构造函数中设置它们。
或者您可以将其移动到每个窗口的OnLoad
事件
为什么不使用在资源字典中定义的样式呢?
<Style x:Key="ViewStyle">
<Setter Property="lex:LocalizeDictionary.DesignCulture" Value="en" />
<Setter Property="lex:ResxLocalizationProvider.DefaultAssembly" Value="WPF.Common" />
<Setter Property="lex:ResxLocalizationProvider.DefaultDictionary" Value="global" />
</Style>
,然后在视图中使用样式:
<UserControl Style="{StaticResource ViewStyle}">
<Page Style="{StaticResource ViewStyle}">
<Window Style="{StaticResource ViewStyle}">
顺便说一句,Visual studio提供了一些很好的功能来简化这类例程。
例如,您可以创建自定义的Item Template,它将生成包含您需要的所有内容的视图。如果您愿意,模板还可以包含视图的ViewModel。它真的很容易创建自定义项目模板。
类似地,您可以创建自定义代码片段,这甚至更简单。当你输入' lex'然后按tab键,它会为你生成这些东西在应用程序资源中为UserControl类型创建一个默认样式。
XAML: <Application x:Class="WpfApplication1.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:lex="http://wpflocalizeextension.codeplex.com"
StartupUri="MainWindow.xaml">
<Application.Resources>
<Style TargetType="UserControl">
<Setter Property="lex:LocalizeDictionary.DesignCulture" Value="en" />
<Setter Property="lex:ResxLocalizationProvider.DefaultAssembly" Value="WPF.Common" />
<Setter Property="lex:ResxLocalizationProvider.DefaultDictionary" Value="global" />
</Style>
</Application.Resources>
</Application>