2009-05-14 3 views
17

В моем пользовательском интерфейсе XAML я по существу наследую от класса «BaseView», который содержит функциональные возможности, общие для нескольких форм, однако это мешает дизайнеру отображать форму: «Мог не создавать экземпляр типа BaseView ". Код будет компилироваться и запускаться, но неудобно не видеть форму в Дизайнере. Есть ли способ лучше? Благодарю.WPF 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" 

...

+0

Является ли ReviewClient родительской сборкой для XAML? Если нет, вам нужно добавить ссылку ReviewClient на сборку, содержащую этот файл XAML. – Gishu

+0

ReviewClient - это локальное пространство имен. – jchadhowell

ответ

21

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

+2

Спасибо! У меня была сама проблема. – Stephen

+0

Я не вижу решения, для дизайнера, в ссылке, которую вы записали. –

+0

Решение состоит в том, чтобы сделать базовый класс бетоном (т. Е. Удалить ключевое слово abstract из базового класса). Не очень удовлетворительное решение, но оно работает. –

4

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

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

1

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

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

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

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

0

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

2

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

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

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

0

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

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

7

Я нашел очень полезное решение для этого: 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.

0

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

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

0

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

public class StringToLowerConverter : IValueConverter