【问题标题】:How to force a particular .resx file to be used in a WPF DLL?如何强制在 WPF DLL 中使用特定的 .resx 文件?
【发布时间】:2009-11-18 23:44:54
【问题描述】:

我有一个从非托管 DLL 调用的 WPF DLL。 WPF DLL 有一个已翻译的对话框(两组 .resx 文件)。

如果我从 WinForm shell 或其他 WPF shell 调用 WPF DLL,我可以通过设置当前线程的文化来强制对话框使用特定语言(.resx 文件)。

但是,当从 C++ DLL 调用 WPF DLL(通过互操作 - COM)时,我无法让 WPF 对话框切换到默认语言以外的任何语言。

我不一定需要阅读当前的系统文化,因为非托管 DLL 的做法不同。我想告诉 WPF DLL 在我运行它时使用什么语言。

如何强制它在运行时加载特定语言?

【问题讨论】:

    标签: wpf localization cultureinfo


    【解决方案1】:

    尝试一下:

    在一次调用中设置文化并创建对话框,如下所示:

    // Managed code
    void SetCultureAndShowWindow(CultureInfo culture, ... more parameters for creating window ...)
    {
      Thread.CurrentThread.CurrentCulture = culture;
      Window window = new Window(...
      window.ShowDialog();
    }
    

    当通过互操作从 C++ 调用时,NET Framework 必须将您的本机线程绑定到 NET Framework 线程。我不记得细节,但我记得一些关于 NET Framework 线程被重用和垃圾收集的机制。如果您正在调用设置区域性的托管代码并再次调用创建窗口,则可能的情况是:

    1. 您调用托管代码来设置文化。
    2. 创建了一个新的托管线程
    3. 您的调用返回,托管线程被释放。
    4. 您调用托管代码来创建和显示窗口。
    5. 创建了一个新的托管线程
    6. 窗口显示的区域性错误

    这样的一系列事件是可以想象的,这取决于托管本机线程绑定代码的实现。因此,我建议您尝试在一次调用中同时执行这两项操作,看看是否有任何改变。

    【讨论】:

    • 是的,我们就是这样做的……当从 WPF 主机、WinForm 主机而不是非托管主机调用时,它可以工作。谢谢。
    猜你喜欢
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多