Я пишу настраиваемый элемент управления, и я бы хотел, чтобы элемент управления переключился с состояния редактирования на нормальное состояние, когда пользователь отключился от элемента управления. Я обрабатываю событие LostFocus, и это помогает, когда пользователь уходит или нажимает на другой элемент управления, который является Focusable. Но если они не нажимают на что-то Focusable, оно не будет отключать его состояние редактирования. Поэтому у меня есть два решения:
- Поднимите дерево до самого верхнего элемента, когда он войдет в состояние редактирования, и добавьте обработчик для
MouseDownEvent
(и обработайте "обработанные" события). В обработчике я удалил бы из него состояние редактирования и удалял обработчик из самого верхнего элемента. Это кажется немного взломанным, но, вероятно, это будет хорошо работать.
Пример кода:
private void RegisterTopMostParentMouseClickEvent()
{
_topMostParent = this.FindLastVisualAncestor<FrameworkElement>();
if ( _topMostParent == null )
return;
_topMostParent.AddHandler( Mouse.MouseDownEvent, new MouseButtonEventHandler( CustomControlMouseDownEvent ), true );
}
private void UnRegisterTopMostParentMouseClickEvent()
{
if ( _topMostParent == null )
return;
_topMostParent.RemoveHandler( Mouse.MouseDownEvent, new MouseButtonEventHandler( CustomControlMouseDownEvent ) );
_topMostParent = null;
}
- Используйте
Mouse.PreviewMouseDownOutsideCapturedElement
и добавьте обработчик к моему элементу управления. В обработчике я удалил бы контроль из этого состояния редактирования. Но, похоже, я не собираюсь возбуждать это событие. Когда вызывается Mouse.PreviewMouseDownOutsideCapturedElement?
Пример кода:
AddHandler( Mouse.PreviewMouseDownOutsideCapturedElementEvent, new MouseButtonEventHandler( EditableTextBlockPreviewMouseDownOutsideCapturedElementEvent ), true );