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),则会再次抛出异常。
有什么具体的方法来处理这种问题吗?
我不知道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/