2013-01-15 80 views
2

我在App.xaml中下面的代码:XamlParseException在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

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"/> 
+0

是的,它有一个默认的构造函数...我已经将它添加到问题中。 –

+0

它也必须公开。最初我应该在我的回答中说。我已经更新了我的回答。 – Tim

+0

我已经提出并添加了一个示例,说明如何自动生成代码以解决此问题。 – Tim

0

参见:

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

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

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