Подтвердить что ты не робот

Дизайнер WPF "Не удалось создать экземпляр типа"

В моем UI XAML я по существу наследую от класса "BaseView", который содержит функциональные возможности, общие для нескольких форм, однако это мешает дизайнеру отображать форму: "Не удалось создать экземпляр типа BaseView". Код будет компилироваться и запускаться, но неудобно не видеть форму в Дизайнере. Есть ли способ лучше? Благодарю.

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"

...

4b9b3361

Ответ 1

Проблема заключалась в том, что базовый класс был определен как абстрактный. Это заставило дизайнера потерпеть неудачу. Эта проблема более подробно описана в разделе комментариев блога Laurent Bugnion: http://geekswithblogs.net/lbugnion/archive/2007/03/02/107747.aspx

Ответ 2

Я нашел очень полезное решение для этого: http://www.progware.org/Blog/post/WPF-Designer-Error-Could-not-create-an-instance-of-type.aspx.

В этой ссылке объясняется, как окно конструктора WPF запускает конструктор для отображения пользовательского интерфейса в XAML и средства защиты: добавляя следующий фрагмент к любой части кода конструктора, которая может давать ошибку:

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

имя функции самоочевидно.:) Эта ссылка также предоставляет решения по вопросам отладки с помощью XAML.

Ответ 3

Еще одна возможная причина, которую мы только что нашли здесь, поэтому я добавляю этот ответ для будущих пользователей, если проект размещен на ненадежном источнике, например файловом сервере.

В этом случае конструктор не загружает сборку и поэтому дает ту же ошибку "Не удалось создать экземпляр...". Решение по-прежнему будет создавать и отлаживать ОК.

Ответ 4

Другая причина. Мой класс управления имел статическое поле, которое было инициализировано из ресурсов, например:

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

Это приведет к исключению нулевой ссылки в редакторе XAML, поскольку ресурсы недоступны в режиме разработки. Если бы это был не цветной ресурс (скажем, кисть), это не будет проблемой, но приведение типа к типу значений вызывает нулевую ссылку.

Ответ 5

Еще одна возможная причина.

У меня есть пользовательский элемент управления, у которого есть дочерние элементы управления, которые генерируют события, например. selection_changed в элементе управления списком. Обработчик события select_changed вносит изменения в другие дочерние элементы управления.

Во время инициализации свойство выбранного элемента в списке изменяется и запускает событие selection_changed. Обработчик пытается обновить другие дочерние элементы управления, но не может, поскольку они еще не созданы. Это приводит к исключению нулевого указателя и вызывает проблему.

Как только проблема с нулевым указателем была обработана, элемент управления мог быть создан и появился в родительском элементе управления.

Ответ 6

У меня проблема, связанная с тем, что мой MVVM-класс имеет доступ к базе данных в конструкторе, и это было проблемой, и это вызывает исключение. Мне нужно только проверить, запущено ли приложение в режиме разработки.

Ответ 7

В WinForms можно использовать конструктор с абстрактными элементами управления, если вы используете пользовательский TypeDescriptionProvider, чтобы сообщить разработчику конкретной реализации:

Я использую решение в этом ответе на другой вопрос, который связывает эту статью. В статье рекомендуется использовать пользовательскую TypeDescriptionProvider и конкретную реализацию абстрактного класса. Дизайнер попросит использовать пользовательский поставщик, который будет использовать, и ваш код может вернуть конкретный класс, чтобы дизайнер был счастлив, пока вы полностью контролируете, как абстрактный класс отображается как конкретный класс.

Ответ 8

И еще одна возможная ситуация (это актуально, по крайней мере, для SL для WP):

Если вы создаете instanse своего класса (например, <local:MyDataSource />), то он должен быть общедоступным. Если ваш класс является внутренним, он будет работать во время разработки, но сработает с этим исключением во время выполнения.

Ответ 9

Причина, по которой я получал эту ошибку, была простой, но трудной для меня отслеживать. Мой класс конвертера не был общедоступным. Простое изменение доступности класса исправило его.

    public class StringToLowerConverter : IValueConverter