Пользовательский элемент управления WPF XAML нулевая ошибка - PullRequest
1 голос
/ 01 октября 2009

Еще одна странная ошибка WPF:

У меня есть пользовательский элемент управления на простой странице XAML. Проект строится и работает отлично, без ошибок.

Вот XAML:

<Window x:Class="Grapher2.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:graph="clr-namespace:Grapher2"
Title="Grapher" Width="800" Height="600">

<StackPanel Name="container"  Width="700" Height="500">
    <graph:GraphCanvas x:Name="graphCanvas" Width="700" Height="500" Background="#ddd" />
</StackPanel>

Но когда я пытаюсь просмотреть страницу XAML в окне дизайнера XAML, я получаю сообщение:

«Проблема при загрузке - в документе содержатся ошибки, которые необходимо исправить ...»

Когда я нажимаю ссылку «Перезагрузить конструктор», в списке ошибок появляется сообщение:

"Ссылка на объект не установлена ​​для экземпляра объекта"

и строка, начинающаяся с «graph: GraphCanvas ...» подчеркнута.

Я изначально разрабатывал на нашем сервере разработки, и там все было так же, кроме ошибки:

"Запрос на разрешение типа 'System.Security.Permissions.SecurityPermission (... бла-бла ... сбой.)"

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

Я пытался очистить, построить, восстановить и все комбинации команд этих команд, но безуспешно.

EDIT:

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

РЕДАКТИРОВАНИЕ № 2:

Мой производный холст не является частичным классом. Из моего понимания того, как работает InitializeComponent ( Что делает InitializeComponent () и как он работает в WPF? ), нет автоматически сгенерированного частичного класса, который содержит InitializeComponent, связанный с моим элементом управления , Опять же, элемент управления отлично работает без него, за исключением нарушения дизайна XAML.

Ответы [ 4 ]

3 голосов
/ 02 октября 2009

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

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

if (something != null)
{
...
}

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

Не очень "научный" подход, но он решил мою проблему. :)

0 голосов
/ 01 октября 2009

Я не уверен, что такое "Grapher2", но вы можете проверить, чтобы убедиться, что в его конструкторе нет кода, который не может работать правильно, когда его создатель создает его экземпляр. Что-то вроде вызова базы данных было бы проблематично.

0 голосов
/ 01 октября 2009

Я видел похожие проблемы.

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

В конструкторе вашего пользовательского элемента управления.

if (!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this))
            InitializeComponent();

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

Редактировать
Я получаю другую ошибку, когда не использую код выше: Не удалось создать экземпляр типа ''

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

0 голосов
/ 01 октября 2009

К сожалению, существуют проблемы с конструктором Cider в Visual Studio 2008, где этот тип ошибок слишком распространен. Версия в VS2010 значительно улучшена, но это неудобно, когда вы решаете эту проблему в VS2008.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...