Дизайнер 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"
...
Ответы
Ответ 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