app.xaml资源字符串中的XamlParseException

时间:2013-01-15 20:26:39

标签: c# wpf string xaml resources

我在App.xaml中有以下代码:

<Application x:Class="PcgTools.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
         xmlns:local="clr-namespace:PcgTools.ViewModels" 
         xmlns:res="clr-namespace:PcgTools.Resources"
         StartupUri="MainWindow.xaml"
         Startup="Application_Startup">
    <Application.Resources>
        <ResourceDictionary>
            ...
            <res:Strings x:Key="LocStrings"/>
        </ResourceDictionary> 
    </Application.Resources>
</Application>

(...是我删除的一些行以使示例更清洁。)

当我运行应用程序时,我收到以下错误(在尝试运行/调试后直接): (翻译自荷兰语所以可能不是100%字面上相同):

在PcgTools.Resources.Strings类型中找不到匹配的构造函数。您可以使用Arguments或FactoryMethod指令来创建此类型。

文件Strings.Designer.cs中有一个构造函数:

namespace PcgTools.Resources {
...
public class Strings {
...

[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute
   ("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Strings() {
    }

然而,它是生成的,所以我甚至无法改变它。

顺便说一句,没有更改代码已经工作(大约一周前),但是大约30%的时间在调试它时发生了这个错误,并且在再次尝试之后没有发生此异常。

2 个答案:

答案 0 :(得分:2)

您的PcgTools.Resources.Strings类是否有公共默认构造函数?我认为它抱怨它无法创建对象,因为它找不到匹配的构造函数,因为你没有使用Arguments,它正在寻找一个默认的构造函数(一个没有参数)。构造函数需要是公共的,而不是内部的或私有的。

自生成代码以来,您需要找到一些解决方法。使用FactoryMethods可能会有效。为此,请设置另一个类,如

namespace PcgTools.Resources
{
    public static class StringResourceHelper
    {
        public static strings GetStringResources()
        {
            return new Resources.Strings();
        }
    }
}

然后在你的XAML中你可以做到:

<res:Strings x:FactoryMethod="res:StringResourceHelper.GetStringResources" 
             x:Key="LocStrings"/>

答案 1 :(得分:0)

另见:

http://dotnet.dzone.com/news/did-you-know-silverlight-class

简而言之:不要命名空间.Resources 它不应该被命名为Resources而是其他东西,否则你将得到如上所述的错误。

编辑:但是,在更改资源字符串后,覆盖的文件(..Designer.cs)仍然包含内部而不是公共构造函数,导致问题出错。