Ошибка времени разработки в пользовательском элементе управления в компактной структуре

Я пишу расширение для стандартного элемента управления ListView в компактной структуре (VS2008, целевая платформа - Windows Mobile 6.1, C #).

В настоящее время класс практически пуст, только одно переопределение метода (см. Код ниже). Проблема, с которой я сталкиваюсь, заключается в следующем: когда у меня есть элемент управления в форме с хотя бы ListViewItem, элемент управления не может инициализироваться при открытии во время разработки.

Действия по воспроизведению:

  1. Создайте проект библиотеки классов смарт-устройств.
  2. Добавить новый класс ListViewEx : System.Windows.Forms.ListView
  3. Переопределите метод OnHandleCreated:

    protected override void OnHandleCreated(EventArgs e)
    {
        base.OnHandleCreated(e);
    }
    
  4. Добавьте в проект файл 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 правильным пространством имен.)

  5. Постройте проект.
  6. Создайте новый проект приложения для смарт-устройств в том же решении.
  7. Перетащите ListBoxEx на Form1 из панели инструментов.
  8. Добавьте один столбец и один ListViewItem с произвольным текстом.
  9. Установите для свойства View ListViewEx значение Details.
  10. Сохраните, перестройте все и закройте вкладку конструктора форм.
  11. Снова открыть конструктор форм.

На этом этапе я ожидал увидеть свое представление списка с одним элементом в нем. Вместо этого 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 '

Некоторые примечания:

  1. Если OnHandleCreated удален, элемент управления работает должным образом.
  2. Элемент управления не сбой инициализируется, когда в нем нет элементов.
  3. Элемент управления отлично работает во время выполнения.

Теперь я понимаю, что очевидным обходным решением было бы избежать переопределения OnHandleCraeted. Но я хочу выполнить некоторые собственные методы Windows, для которых требуется дескриптор HWND как часть процедуры инициализации. И OnHandleCreated кажется подходящим местом для этого. (Элемент управления не работает только при наличии base.OnHandleCreated в теле метода)

Итак, вопрос: есть ли способ сохранить OnHandleCreated переопределение и заставить управление работать во время разработки? Или еще один: когда и где лучше всего выполнять собственные методы Windows, требующие дескриптора HWND?


person Dmitri Trofimov    schedule 24.09.2014    source источник
comment
Конечно, пахнет ошибкой, и перемещение инициализации, как вы это сделали, вероятно, единственный хороший способ ее обойти.   -  person ctacke    schedule 25.09.2014


Ответы (1)


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

Хотя пахнет грязным хаком.

person Dmitri Trofimov    schedule 24.09.2014