【问题标题】:XAML cannot reach localized resourcesXAML 无法访问本地化资源
【发布时间】:2020-08-03 16:56:56
【问题描述】:

我在处理子项目的本地化资源时遇到了问题。

主项目(称为 Z)使用子项目(称为 ProjectsModule),它有自己的资源。子项目有两个资源文件:

Strings.resx
Strings.pl-PL.resx

应用程序正在以波兰语作为当前 UI 文化的调试模式运行。

我收到以下异常:

System.Windows.Markup.XamlParseException: 'Operacja podawania wartości elementu 
„System.Windows.Markup.StaticExtension” wywołała wyjątek., numer wiersza 24, pozycja 52.'
ArgumentException: Obiektu StaticExtension 
„ProjectsModule.Resources.Strings.Projects_Config_Projects” nie można rozpoznać jako wyliczenia, pola 
statycznego ani właściwości statycznej.

翻译过来是这样的:

"ProjectsModule.Resources.Strings.Projects_Config_Projects" cannot be recognized as enum, static field
or static property.

在加载窗口的 XAML 时会发生这种情况。所以我做了一个测试并修改了窗口的构造函数:

public ConfigurationWindow(ConfigurationWindowViewModel viewModel)
{
    // *** DEBUG ***
    System.Diagnostics.Debug.WriteLine(ProjectsModule.Resources.Strings.Projects_Config_Projects);
    // *** END DEBUG ***

    InitializeComponent();

    this.viewModel = viewModel;
    viewModel.Access = this;
    this.DataContext = viewModel;
}

奇怪的是,我得到了以下输出:

Katalogi projektów
'Z.exe' (CLR v4.0.30319: Z.exe): Loaded     'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Xaml.resources\v4.0_4.0.0.0_pl_b77a5c561934e089\System.Xaml.resources.dll'. Module was built without symbols.
Exception thrown: 'System.ArgumentException' in System.Xaml.dll
Exception thrown: 'System.Xaml.XamlObjectWriterException' in System.Xaml.dll
Exception thrown: 'System.Windows.Markup.XamlParseException' in PresentationFramework.dll
Operacja podawania wartości elementu „System.Windows.Markup.StaticExtension” wywołała wyjątek., numer wiersza 24, pozycja 52.

“Katalogi projektów”正是我正在寻找的资源 - 所以它显然是可以访问的。但是,由于某种原因,XAML 解析器无法访问它(您可以在正确解析资源后看到前面提到的异常)。

我做错了什么?为什么 XAML 解析器无法使用明显可用的资源(此外,从正确翻译的附属程序集中读取)?


编辑:回应cmets

资源使用情况:

<Window ...
    xmlns:properties="clr-namespace:ProjectsModule.Resources"
</Window>

...

<TextBlock DockPanel.Dock="Top" Margin="3" Style="{StaticResource Header}" 
    Text="{x:Static properties:Strings.Projects_Config_Projects}"></TextBlock>

文化基于操作系统文化。所以它是自动设置的。

【问题讨论】:

  • 您能说明您在 XAML 中使用资源的位置以及设置区域性的位置吗?
  • @thatguy,已编辑帖子。

标签: c# wpf localization resources


【解决方案1】:

StaticExtension 值无法解析为枚举、静态字段或静态属性。

您的.resx 文件必须具有Public 访问修饰符,否则您将在运行时获得XamlParseException,因为XAML 解析器无法访问资源。默认为Internal,因此无法从其他程序集访问资源。要更改访问修饰符,请转到资源编辑器并在标题下拉菜单中进行更改。

或者,将资源文件属性中的CustomTool 更改为PublicResXFileCodeGenerator

【讨论】:

  • 奇怪的是,当没有附属程序集时,内部工作正常。但事实上,切换到公共的工作。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
相关资源
最近更新 更多