.Net C # Design View ошибки - PullRequest
       18

.Net C # Design View ошибки

2 голосов
/ 03 февраля 2009

Я создал подкласс Treeview и при его создании загружается новый ImageList (и связанные изображения).

Всякий раз, когда я переключаюсь в представление дизайнера, он также пытается запустить этот код, однако изображения не находятся в пути дизайнера, поэтому он вылетает. Я закончил тем, что вставил хак, чтобы увидеть, является ли текущий каталог "Visual Studio", а затем ничего не делать ... но это так ужасно.

Я считаю, что это происходит для других вещей. Если элемент управления пытается использовать во время загрузки / инициализации объекты, доступные только во время работы программы, то представление «Дизайн» не может вызвать элемент управления.

Но есть ли способ обойти это?

Полагаю, что я надеюсь на то, чтобы попытаться / поймать конструктор (только) с возможностью игнорировать несколько ошибок, которые, как я знаю, будут происходить (например, FileNotFoundException и т. Д.).

Спасибо

Ответы [ 4 ]

4 голосов
/ 03 февраля 2009

Все, что наследуется от System.Windows.Forms.Control, имеет свойство DesignMode, которое возвращает логическое значение, указывающее, находитесь ли вы в режиме разработки или нет. Вы можете использовать это, чтобы определить, когда / когда не загружать внешние ресурсы.

1 голос
/ 04 февраля 2009

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

Я бы предложил перенести вашу «бизнес-логику» (в данном случае загрузку определенных изображений в древовидную структуру) за пределы вашего элемента управления древовидной структурой. В вашем случае я бы поместил логику в событие Load формы, в которой находится элемент управления:

public void Load(object sender, EventArgs e)
{
    string path = "c:\somePath\toAwesome\Images";
    myFunkyTreeView.AddImages(path);
}

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

1 голос
/ 04 февраля 2009

Спасибо, что указали мне правильное направление, ребята.

Я пытался зарегистрироваться в событии OnLoad, но это событие вызывается, когда появляется представление конструктора, так что это не совсем помогло мне (я что-то не так делаю?).

Во всяком случае, я немного больше посмотрел на свойство DesignMode. Он может работать только для элементов управления, а иногда ваш объект может даже не быть элементом управления.

Итак, вот ответ, который я предпочитаю:

if (LicenseManager.UsageMode == LicenseUsageMode.Designtime) {
    // design-time stuff
} else {
    // run-time stuff
}

Нашел здесь .

1 голос
/ 03 февраля 2009

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

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

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