Я пишу расширение для стандартного элемента управления ListView в компактной структуре (VS2008, целевая платформа - Windows Mobile 6.1, C #).
В настоящее время класс практически пуст, только одно переопределение метода (см. Код ниже). Проблема, с которой я сталкиваюсь, заключается в следующем: когда у меня есть элемент управления в форме с хотя бы ListViewItem, элемент управления не может инициализироваться при открытии во время разработки.
Действия по воспроизведению:
- Создайте проект библиотеки классов смарт-устройств.
- Добавить новый класс
ListViewEx : System.Windows.Forms.ListView
Переопределите метод
OnHandleCreated
:protected override void OnHandleCreated(EventArgs e) { base.OnHandleCreated(e); }
Добавьте в проект файл
DesignTimeAttributes.xmta
:<Classes xmlns="http://schemas.microsoft.com/VisualStudio/2004/03/SmartDevices/XMTA.xsd"> <Class Name="CompleteNamespace.ListViewEx"> <DesktopCompatible>true</DesktopCompatible> <DesignTimeVisible>true</DesignTimeVisible> </Class> </Classes>
(Замените
CompleteNamespace
правильным пространством имен.)- Постройте проект.
- Создайте новый проект приложения для смарт-устройств в том же решении.
- Перетащите
ListBoxEx
наForm1
из панели инструментов. - Добавьте один столбец и один
ListViewItem
с произвольным текстом. - Установите для свойства
View
ListViewEx
значениеDetails
. - Сохраните, перестройте все и закройте вкладку конструктора форм.
- Снова открыть конструктор форм.
На этом этапе я ожидал увидеть свое представление списка с одним элементом в нем. Вместо этого VS выдает ошибку:
Элемент управления Microsoft.CompactFramework.Design.HeaderControl вызвал необработанное исключение в конструкторе и был отключен.
Исключение:
InvalidArgument = Значение «-1» недопустимо для «индекса». Имя параметра: index
Трассировка стека:
в Microsoft.CompactFramework.Design.HeaderControl.OnPaint (PaintEventArgs e)
в Microsoft.CompactFramework.Design.HeaderControl.WndProc (Message & m)
Когда я нажимаю OK
, заполнитель ListViewEx выглядит так:
Кроме того, если я оставлю форму открытой на некоторое время (около минуты), VS также выдаст новую ошибку:
Не удалось создать код для свойства Items. Ошибка была: «InvalidArgument = Значение« -1 »недопустимо для« индекса ».
Имя параметра: index '
Некоторые примечания:
- Если
OnHandleCreated
удален, элемент управления работает должным образом. - Элемент управления не сбой инициализируется, когда в нем нет элементов.
- Элемент управления отлично работает во время выполнения.
Теперь я понимаю, что очевидным обходным решением было бы избежать переопределения OnHandleCraeted
. Но я хочу выполнить некоторые собственные методы Windows, для которых требуется дескриптор HWND как часть процедуры инициализации. И OnHandleCreated
кажется подходящим местом для этого. (Элемент управления не работает только при наличии base.OnHandleCreated
в теле метода)
Итак, вопрос: есть ли способ сохранить OnHandleCreated
переопределение и заставить управление работать во время разработки? Или еще один: когда и где лучше всего выполнять собственные методы Windows, требующие дескриптора HWND?