WPF设计器“无法创建类型的实例”

时间:2009-05-14 04:37:33

标签: wpf xaml inheritance designer

在我的UI XAML中,我基本上继承了一个“BaseView”类,它包含多个表单共有的功能,但这阻止了设计者显示表单:“无法创建BaseView类型的实例”。代码将编译并运行,但是不能在Designer中看到该表单是令人沮丧的。有没有更好的办法?谢谢。

XAML:

<vw:BaseView 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:vw="clr-namespace:ReviewClient"   
    x:Class="ReviewClient.MainPage"

...

11 个答案:

答案 0 :(得分:21)

问题是基类被定义为抽象。这导致设计师失败。 Laurent Bugnion博客的评论部分更详细地描述了这个问题:http://geekswithblogs.net/lbugnion/archive/2007/03/02/107747.aspx

答案 1 :(得分:8)

我找到了一个非常有用的解决方案: http://www.progware.org/Blog/post/WPF-Designer-Error-Could-not-create-an-instance-of-type.aspx

此链接说明了WPF设计器窗口如何运行构造函数以在XAML中显示UI以及补救措施: 将以下代码段添加到可能给出错误的构造函数代码的任何部分:

if(!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this))
{
   //code producing exception         
}

函数名称是自解释的。 :) 此链接还提供有关使用XAML调试问题的解决方案。

答案 2 :(得分:4)

另一个可能的原因,正如我们刚才在这里找到的,所以我为未来的用户添加了这个答案,如果项目托管在不受信任的来源上,例如文件服务器。

在这种情况下,设计人员不会加载程序集,因此给出了相同的“无法创建实例...”错误。该解决方案仍然可以构建和调试。

答案 3 :(得分:2)

另一个原因。我的控件类有一个从资源初始化的静态字段,如下所示:

 static Color s_ImgColor = (Color)TheApp.Resources["PhoneForegroundColor"];

这将在XAML编辑器中抛出空引用异常,因为资源在设计模式下不可用。如果它不是颜色资源(例如,画笔),这不会是一个问题,但是值类型的类型转换会引发空引用。

答案 4 :(得分:1)

另一个可能的原因。

我有一个用户控件,它有子控件,可以生成事件,例如list_changed列表控件。 select_changed事件处理程序对其他子控件进行更改。

在初始化期间,列表框的选定项属性会更改并触发selection_changed事件。处理程序尝试更新其他子控件但不能,因为它们尚未实例化。这会导致空指针异常并导致问题。

一旦处理了空指针问题,控件就可以实例化并出现在父控件中。

答案 5 :(得分:0)

我遇到的问题是我的MVVM类在构造函数中访问了数据库,这就是问题所在,它会引发异常。我只需要检查应用程序是否在设计模式下运行。

答案 6 :(得分:0)

在WinForms中,如果使用自定义TypeDescriptionProvider通知设计者具体实现,则可以使用带有抽象控件的设计器:

我正在使用this answer中的解决方案来解决另一个与this article相关联的问题。本文建议使用自定义TypeDescriptionProvider和抽象类的具体实现。设计人员会询问自定义提供程序要使用哪些类型,并且您的代码可以返回具体类,以便设计人员在您完全控制抽象类如何作为具体类出现时感到高兴。

答案 7 :(得分:0)

另一种可能的情况(对于WP来说这至少是SL的实际情况):

如果您创建了课程的实例(例如<local:MyDataSource />),那么应该是公开的。如果您的类是内部的,它将在设计时工作,但在运行时会因此异常而失败。

答案 8 :(得分:0)

我之所以遇到这个错误很简单,但我很难追查。我的转换器类不公开。只需更改类的可访问性即可修复它。

    public class StringToLowerConverter : IValueConverter

答案 9 :(得分:0)

我不知道问题出在哪里,但是我这样解决了:

您不应在父类的构造函数中执行代码,而应在父类的构造函数中执行代码。

您可以在BaseClass中创建一个从父类的构造函数执行的方法。

答案 10 :(得分:0)

enter image description here

是的!我解决了在将“控件显示选项”设置为“仅显示平台控件”后,表单最终显示在“显示”上,并且错误消失了。检出图片以找到它。