Просто чтобы прояснить ответ о фокусировке мыши - это было полезно, но мне пришлось немного покопаться, чтобы получить что-то, что действительно сработало:
Я пытался реализовать что-то вроде выпадающего списка и нуждался в похожем поведении - чтобы раскрывающийся список исчезал при нажатии на что-то другое, без элемента управления, обладающего знанием того, что еще было.
У меня было следующее событие для кнопки выпадающего меню:
private void ClickButton(object sender, RoutedEventArgs routedEventArgs)
{
//do stuff (eg activate drop down)
Mouse.Capture(this, CaptureMode.SubTree);
AddHandler();
}
CaptureMode.SubTree означает, что вы получаете только те события, которые находятся вне элемента управления, и любая активность мыши в элементе управления передается вещам, как обычно. У вас нет возможности предоставить этот Enum в CaptureMouse UIElement, это означает, что вы получите вызовы HandleClickOutsideOfControl INSTEAD для вызовов любых дочерних элементов управления или других обработчиков внутри элемента управления. Это так, даже если вы не подписываетесь на события, которые они используют - полный захват мыши - это слишком много!
private void AddHandler()
{
AddHandler(Mouse.PreviewMouseDownOutsideCapturedElementEvent, new MouseButtonEventHandler(HandleClickOutsideOfControl), true);
}
Вы также должны были бы удержать + удалить обработчик в соответствующих точках, но я оставил это здесь для ясности / краткости.
Наконец, в обработчике вам нужно снова освободить захват.
private void HandleClickOutsideOfControl(object sender, MouseButtonEventArgs e)
{
//do stuff (eg close drop down)
ReleaseMouseCapture();
}