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

问题描述 投票:18回答:10

在我的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"

...

wpf xaml inheritance designer
10个回答
21
投票

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


9
投票

我在以下位置找到了一个非常有用的解决方案: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调试问题的解决方案。


4
投票

[另一个可能的原因,就是我们刚刚在这里找到的,因此我为将来的用户添加了这个答案,就是该项目是否托管在不受信任的源(例如文件服务器)上。

在那种情况下,设计人员不会加载程序集,因此会出现相同的“无法创建实例...”错误。该解决方案仍会生成并调试OK。


2
投票

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

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

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


1
投票

还有另一个可能的原因。

我有一个用户控件,该控件具有子控件,这些控件会生成事件,例如selection_changed在列表控件上。 select_changed事件处理程序对其他子控件进行了更改。

初始化期间,列表框的选定项属性被更改并触发selection_changed事件。处理程序将尝试更新其他子控件,但由于尚未实例化而无法更新。这导致空指针异常并导致问题。

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


0
投票

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


0
投票

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

我正在将this answer中的解决方案用于另一个问题,该问题链接了this article。本文建议使用自定义TypeDescriptionProvider和抽象类的具体实现。设计器将询问定制提供程序以使用哪种类型,并且您的代码可以返回具体的类,以便您可以完全控制抽象类如何显示为具体的类,从而使设计者感到满意。


0
投票

还有另一种可能的情况(这至少对于WP的SL是这样的:]

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


0
投票

我收到此错误的原因很简单,但我很难找到答案。我的转换器课程不是公开的。只需更改类的可访问性即可解决。

    public class StringToLowerConverter : IValueConverter

0
投票

我不知道问题是什么,但是我这样解决了它:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.