WPF c# - 无法加载文件.resources

时间:2014-06-15 23:09:54

标签: c# wpf xaml

启动我的wpf应用程序并尝试显示特定控件我收到此异常:

" FileNotFoundException - 无法加载文件或程序集" Xceed.WPF.Toolkit.resources,version = 2.0.0.0,Culture = it-IT ...."

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

我的应用程序(Wolf.exe)适用于插件系统。插件系统从位于Extension应用程序文件夹内的外部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依赖于"扩展WPF工具包™社区版" (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控件(在MainWindow.xaml上),则不会发生此异常。这个问题也很奇怪,因为我没有任何类型的.resources.dll文件。

我发现解决问题的唯一方法是为扩展WPF工具包™社区版&#34;指定默认文化程序集。并重建它。

此修复程序适用于我的机器配置,其中包含&#34; it-IT&#34;语言/文化。如果我在具有不同文化的不同机器(即en-US)中启动我的应用程序,则会再次抛出异常。

有没有特定的方法来处理这类问题?如果您需要更多信息,请与我们联系。

1 个答案:

答案 0 :(得分:1)

我并不清楚Xceed是如何工作的,但是当使用多种文化时,必须对装配进行装饰以指示默认文化。否则.NET运行时会抱怨无法找到资源文件。对于每个消费程序集,它都在AssembyInfo.cs

  

在桌面应用中,使用NeutralResourcesLanguageAttribute属性   通知资源管理器应用程序的默认文化和   资源的位置。默认情况下,资源嵌入在   主应用程序集,您可以使用如下属性。

宣言看起来像这样......

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

其中&#34; en-GB&#34;指定默认值。如果你找不到它,装配的装饰就像这样......

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