代码之家  ›  专栏  ›  技术社区  ›  urini

使用嵌入的WPF用户控件本地化WinForms应用程序

  •  1
  • urini  · 技术社区  · 16 年前

    我试图本地化的应用程序是一个WinForms应用程序,它有几个宿主WPF用户控件(在ElementHost WinForms控件中宿主的WPF用户控件)。

    我用 resx 用于本地化WinForms的文件,VS2008管理得非常好。

    当我试图使用 LocBaml 方法来本地化WPF部分。

    下面是发生的事情: 当我构建解决方案时,Visual Studio会自动为我生成附属程序集,但仅为resx文件中的WinForms资源生成附属程序集。 然后,当我使用LocBaml命令行工具时,它为我生成附属程序集,但仅为xaml文件中的WPF资源生成附属程序集。

    我还没有想出如何将两个生成的dll(WPF&WinForms)合并到一个附属程序集中。

    3 回复  |  直到 16 年前
        1
  •  3
  •   dustyburwell    15 年前

    Blech…WPF团队似乎在他们的本地化解决方案中留下了一些需要的东西。好吧,为了它的价值,这里是我一直在做的(公平地说,我实际上是从 Jecho Jekov 在代码项目中):

    首先,您需要创建(或借用)一个本地化MarkupExtension类。Jecho给他的LocExtension打电话,我给我的i18nExtension打电话,除了我觉得它比Loc更具描述性之外,没有其他原因。此标记扩展将在资源文件中查找给定的资源键。如果希望所有资源都位于Properties/resources.resx文件中,这是一个非常简单且易于编写代码的类。

    在您的xaml中,您最终得到的是这样的结果:

    <UserControl ... >
        ...
        <TextBox Text="{i18n HelloWorld}"/>
        ...
    </UserControl>
    

    如果要像WinForms设计器所允许的那样为每个UserControl/Window分别创建resx文件,则必须在MarkupExtension中获得更多的创造性,以便它能够确定其上下文。

    最终,每个区域性都有一个附属程序集,这似乎是您的追求。我想到的一个警告是,我不确定这是如何应对即时文化/语言变化的。至少,需要重新加载窗口/控件。

        2
  •  0
  •   Community Reversed Engineer    7 年前

    为了得到 the method dustyburwell posted 在WinForms嵌入式WPF用户控件中工作时,需要在WinForms窗体构造函数处的InitializeComponent()调用之后将区域性设置为usercontrol,然后更新值。

    1. 声明WinForms表单。
    2. 添加ElementHost(elementHost1)。
    3. 在elementHost1(userControl1)中添加WPF UserControl。
    4. 打开窗体的代码。编写以下代码:
        public Form1()
        {
            InitializeComponent();
    
            WpfLocalization.LocalizationScope.SetCulture(userControl1, System.Threading.Thread.CurrentThread.CurrentCulture);
            WpfLocalization.LocalizationScope.SetUICulture(userControl1, System.Threading.Thread.CurrentThread.CurrentCulture);
            WpfLocalization.LocalizationManager.UpdateValues();
        }
    

    每当当前区域性更改时,必须为每个嵌入WinForms的WPF用户控件调用这3行。

        3
  •  0
  •   Jared G    12 年前

    如何将多组资源合并到单个附属程序集中

    正确的方法是 AL.exe (程序集链接器工具)将windows窗体.resources文件和由LocBaml生成的.resources嵌入到单个附属程序集中(默认情况下,替换仅包含WinForms资源的原始生成)。

    构建混合应用程序的步骤如下:

    1. 构建解决方案(仅生成WinForms.resource文件和附属dll)。
    2. 使用locBaml工具生成XAML.resource文件
    3. 使用AL.exe将两组.resource文件链接到新的混合附属dll中,并替换步骤1中的原始文件。重建项目将需要重复步骤2和3以重新合并xaml资源,因此您可能希望通过将其添加为构建步骤或目标来实现自动化。

    示例用法:

    Al.exe /out:MyApp.resources.dll /culture:es-ES /embed:MyApp.Form1.es-ES.resources /embed:MyAppWpf.g.es-ES.resources
    

    更多信息(本地化混合应用程序) http://msdn.microsoft.com/en-us/library/ms754231.aspx