是否有任何方法为本地化扩展全局分配默认值

本文关键字:扩展 全局 分配 默认值 本地化 任何 方法 是否 | 更新日期: 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>