WPF无法加载文件资源

本文关键字:文件 资源 加载 WPF | 更新日期: 2023-09-27 18:08:48

启动我的wpf应用程序,并试图显示一个特定的控件,我收到这个异常:

"FileNotFoundException -无法加载文件或程序集"。资源,版本=2.0.0.0,文化=it-IT...."

我知道这个问题似乎已经讨论过了,但我的问题更具体一点。

我有我的应用程序(Wolf.exe)与插件系统一起工作。插件系统从位于扩展应用程序文件夹内的外部dll加载插件类(此文件夹位于.exe的同一级别)。插件可以加载额外的资源,如xaml字典,并指定自定义样式来扩展基本组件。

其中一个插件/程序集(FSMExtension.dll)以这种方式加载额外的xaml资源:

            FileStream oFileStream = new FileStream(filename, FileMode.Open);
            if (oFileStream != null)
            {
                ResourceDictionary oResourceDictionary = (ResourceDictionary)XamlReader.Load(oFileStream);
                if (oResourceDictionary != null)
                {
                    Application.Current.Resources.MergedDictionaries.Add(oResourceDictionary);
                }
            }
            oFileStream.Close();

FSMExtension.dll依赖于"Extended WPF Toolkit™Community Edition"(http://wpftoolkit.codeplex.com/documentation),因为它需要一个PropertyGrid组件。生成的xaml具有类似的方面:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:converters="clr-namespace:WolfLib.UI.Converters;assembly=WolfLib"
                xmlns:xctk="clr-namespace:Xceed.Wpf.Toolkit.PropertyGrid;assembly=Xceed.Wpf.Toolkit">
<converters:BooleanToVisibilityConverter x:Key="BoolToVisibilityConverter" IsHidden="false" TriggerValue="false"></converters:BooleanToVisibilityConverter>
<Style x:Key="FSMBlockStyle" TargetType="ContentControl">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <xctk:PropertyGrid Grid.Row="5" Grid.ColumnSpan="2" Margin="5 0 5 5"  Visibility="{Binding ElementName=PropertyToggleButton, Path=IsChecked, Converter={StaticResource BoolToVisibilityConverter}}"
                                   ShowSummary="false"
                                   IsCategorized="true"
                                   ShowAdvancedOptions="false"                                                   
                                   IsReadOnly="false"
                                   ShowSortOptions="false"
                                   ShowSearchBox="false"
                                   ShowTitle="false"
                                   AutoGenerateProperties="false"
                                   MaxWidth="300">
                    <xctk:PropertyGrid.PropertyDefinitions>
                        <xctk:PropertyDefinition TargetProperties="Name,Type,MainController,Views,ControllerBehaviours,ControllerParams"/>
                    </xctk:PropertyGrid.PropertyDefinitions>
                </xctk:PropertyGrid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

当我对控件应用特定的样式时,我收到了上面的异常。如果我试图在我的应用程序(在主窗口)内直接使用PropertyGrid控件,则不会发生此异常。xaml)。这个问题也很奇怪,因为我没有这个程序集的任何类型的.resources.dll文件。

我发现解决这个问题的唯一方法是为"Extended WPF Toolkit™Community Edition"指定默认区域性程序集并重新构建它。

此修复将适用于我的机器配置与"it"语言/文化。如果我在另一台具有不同文化的机器上启动应用程序(例如en-US),则会再次抛出异常。

有什么具体的方法来处理这种问题吗?

WPF无法加载文件资源

我不知道Xceed是如何工作的,但是当使用多个区域性时,必须对程序集进行装饰以指示默认区域性。否则,. net运行时将抱怨无法找到资源文件。它在AssembyInfo.cs中用于每个消费组件:

在桌面应用中,NeutralResourcesLanguageAttribute属性通知资源管理器应用程序的默认区域性和资源的位置。缺省情况下,资源嵌入到主应用程序程序集,你可以像下面这样使用该属性。

声明如下:

[assembly: NeutralResourcesLanguage("en-GB")]

其中"en-GB"指定默认值。如果你很难找到它,一个组装的装饰看起来像这样…

// General Information about an assembly is controlled through the following 
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("MultiLanguage")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("MultiLanguage")]
[assembly: AssemblyCopyright("Copyright ©  2014")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: NeutralResourcesLanguage("en-GB")]

文档在这里http://msdn.microsoft.com/en-us/library/system.resources.neutralresourceslanguageattribute.aspx

这里有一个WPF参考应用程序的源代码https://tcimultilanguage.codeplex.com/