WPF комбинированный пользовательский элемент управления - PullRequest
2 голосов
/ 16 февраля 2011

Я хотел бы создать пользовательский элемент управления, который будет выглядеть как стандартный WPF ComboBox, но вместо всплывающего окна вместо ItemsPresenter будет другой пользовательский элемент управления. Итак, я создал новый класс, производный от System.Windows.Controls.Control, добавил свойство IsDropDownOpen и создал стиль, который на самом деле является копией стиля ComboBox по умолчанию (основная идея заключается в том, что свойства Popup.IsOpen и ToggleButton.IsPressed привязан к свойству IsDropDownOpen элемента управления).

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

Я посмотрел на класс ComboBox в Reflector и обнаружил, что ComboBox использовал некоторую логику для обновления свойства IsDropDownOpen, когда оно теряет захват мыши. Но этот код использует некоторые внутренние классы. Есть ли альтернативный способ определить, нажал ли пользователь за пределами элемента управления и закрыть Popup?

UPD: я не нашел способ прикрепить файл к записи, поэтому я загрузил пример проекта здесь

Существует пользовательский элемент управления, похожий на ComboBox, но он имеет TreeView во всплывающем окне. Когда вы открываете всплывающее окно и щелкаете за пределами элемента управления, оно автоматически закрывается, но если вы открываете всплывающее окно, разверните «Item2», а затем щелкните за пределами всплывающего окна, которое не будет закрыто. Вопрос в том, как это исправить?

Ответы [ 2 ]

0 голосов
/ 24 февраля 2011

Этот код решает проблему.

В статическом конструкторе:

EventManager.RegisterClassHandler(typeof(CustomComboBox), Mouse.LostMouseCaptureEvent, new MouseEventHandler(OnMouseCaptureLost));

Реализация обработчика событий:

private void OnMouseCaptureLost(object sender, MouseEventArgs e)
{
   if (Mouse.Captured != _container)
   {
      if (e.OriginalSource != _container)
      {
         Mouse.Capture(_container, CaptureMode.SubTree);
         e.Handled = true; 
      }
   }
}
0 голосов
/ 16 февраля 2011

Существует событие Control.LostFocus, возможно, для этого достаточно обработки.

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