XAML 无法访问本地化资源

XAML cannot reach localized resources

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

主项目(称为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.

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

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 解析器无法使用显然可用的资源(而且,从正确翻译的附属程序集中读取)?


编辑:回复评论

资源使用:

<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>

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

StaticExtension value cannot be resolved to an enumeration, static field, or static property.

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

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