VB.Net: динамически созданный MonthCalendar не запускает LostFocus или GotFocus

Я создал форму с элементом управления с вкладками, который динамически добавляет пользовательские элементы управления на каждую вкладку, а также StatusStrip в нижней части формы. Когда приложение запускается, пользовательские элементы управления загружаются на вкладках в зависимости от безопасности, при этом загружается как минимум 1 вкладка. На StatusStrip два ToolStripComboBox, 2 ToolStripButtons, 1 ToolStripLabel и 1 ToolStripStatusLabel. Все отлично загружается и работает.

Меня попросили открыть всплывающее окно MonthCalendar, когда пользователь нажимает одну из двух кнопок. Вот код, который я использую для этого:

If IsNothing(theCal) Then
    theCal = New MonthCalendar
    AddHandler theCal.DateSelected, AddressOf theCalDateSelected
    AddHandler theCal.LostFocus, AddressOf theCalLostFocus
    AddHandler theCal.GotFocus, AddressOf theCalLostFocus
    theCal.Parent = Me
    theCal.Top = StatusStripMain.Top - theCal.Height
    theCal.Left = ComboBoxAvailableLegDay.Bounds.X
    theCal.Anchor = AnchorStyles.Bottom + AnchorStyles.Left
    theCal.Show()
    theCal.BringToFront()
    theCal.Focus()
Else
    Me.Controls.Remove(theCal)
    theCal = Nothing
End If

theCal определяется как Protected в верхней части класса формы. Таким образом, нажатие кнопки создаст MonthCalendar и правильно расположит его, если он не существует, а если он существует, то он будет удален. Это работает без проблем.

Моя проблема в том, что theCal никогда не запускает GotFocus или LostFocus. У меня есть процедура theCalLostFocus, определенная следующим образом, и она никогда не генерирует исключение. Я могу поставить точку останова в броске, и код никогда не дойдет до этой точки.

Private Sub theCalLostFocus(ByVal sender As Object, ByVal e As EventArgs)
    Throw New NotImplementedException
End Sub

Щелчок даты в Cal вызовет процедуру CalDateSelected, но щелчок в любой другой области формы не запускает CallLostFocus. Поскольку пользователь может захотеть не выбирать дату, и я не хочу заставлять их нажимать кнопку, чтобы удалить Cal, я хотел бы иметь возможность удалить Cal, когда он теряет фокус. Кто-нибудь знает, почему это происходит, и у кого-нибудь есть решение?

Спасибо. -NCGrimbo


person NCGrimbo    schedule 23.08.2012    source источник


Ответы (1)


я не удивлен, что событие фокуса не сработает, потому что вы добавляете обработчик перед его вставкой в ​​визуальное дерево. попробуйте добавить обработчик после вызова show(). или, может быть, в загруженном обработчике событий. Обратите внимание, что, поскольку вы запрашиваете фокус, ваш обработчик события фокуса будет вызываться каждый раз.

Rq : как написано, в вашем коде есть утечка памяти, так как вы не удаляете обработчик событий при очистке Cal, поэтому, поскольку ссылка сохраняется на theCal, ни theCal, ни обработчик событий не очищаются, и это приводит к утечке памяти (циклический Справка).

person GameAlchemist    schedule 23.08.2012
comment
Я переместил операторы AddHandler в строку после Cal.Show() и не увидел никаких изменений в поведении. (И я добавил удаление обработчиков событий согласно вашему примечанию.) - person NCGrimbo; 30.08.2012
comment
Я только что заметил, что подпись вашего обработчика событий (Got/Lost) focus неверна. Это должно быть перенаправленное событие: (ByVal sender As Object, ByVal e As RoutedEventArgs) - person GameAlchemist; 30.08.2012
comment
Когда я изменяю вызов на RoutedEventArgs, я получаю сообщение об ошибке: тип «RoutedEventArgs» не определен. - person NCGrimbo; 01.09.2012
comment
странно... у вас в ссылках нет ядра Presentation?? 1) напишите System.Windows.RoutedEventArgs 2) если это все еще не работает, добавьте PresentationCore в свои ссылки (проект/ссылки) - person GameAlchemist; 01.09.2012