Как узнать, когда собирается открываться контекстное меню текстового поля по умолчанию (до его открытия) или после его закрытия (не до, после)? События ContextMenuOpening и ContextMenuClosing, похоже, не срабатывают, когда я использую стандартное встроенное меню. Я предполагаю, что я мог бы просто воссоздать меню и заполнить его стандартными командами, но это кажется немного излишним.
Причина этого, в частности, заключается в том, что у меня есть шаблонный элемент управления, в котором текстовое поле поменяно местами в режиме «Редактировать». Этот элемент управления автоматически выходит из режима редактирования, когда текстовое поле теряет фокус. Проблема в том, что всплывающее контекстное меню, текстовое поле теряет фокус, и поэтому оно выходит из режима редактирования, и контекстное меню мгновенно исчезает.
Я хочу сделать прямо перед открытием контекстного меню, установить флаг для короткого замыкания кода события LostFocus в текстовом поле. Затем после контекстное меню закрывается, мне нужно сбросить этот флаг, но мне также нужно определить, является ли элемент управления, который теперь имеет фокус, все еще текстовым полем, и если нет, то обработать код, как если бы он это сделал потерять фокус (С другой стороны, я мог бы проверить событие до его закрытия, если бы знал, какой элемент управления будет иметь фокус, как только он закроется. Он достиг бы того же эффекта.)
Это необходимо для обработки конкретного случая, если кто-то показывает контекстное меню (и поэтому текстовое поле технически больше не имеет фокуса), но затем щелкает в другом месте пользовательского интерфейса, который закрывает контекстное меню, потому что мне тогда нужно обнаружить что текстовое поле фактически потеряло фокус, и элемент управления должен выйти из режима редактирования. Но если пользователь закрывает контекстное меню, щелкая обратно в текстовом поле, то я не хочу, чтобы это событие LostFocus сработало.
Имеет смысл?
M
ОБНОВЛЕНИЕ: Технически на этот вопрос не было ответа, хотя я пометил его как таковой, поскольку ответчики помогли мне решить мою проблему. Но что касается самого вопроса здесь, похоже, что ответ «Вы не можете».
Хорошая новость заключается в том, что контекстное меню текстового поля по умолчанию состоит всего из трех стандартных элементов, его легко скопировать, добавив его в ресурсы где-то ...
<ContextMenu x:Key="DefaultTextBoxContextMenu">
<MenuItem Command="ApplicationCommands.Cut" />
<MenuItem Command="ApplicationCommands.Copy" />
<MenuItem Command="ApplicationCommands.Paste" />
</ContextMenu>
... и прикрепить его вот так ...
<TextBox x:Name="EditTextBox"
ContextMenu="{StaticResource DefaultTextBoxContextMenu}"
ContextMenuOpening="EditTextBox_ContextMenuOpening"
ContextMenuClosing="EditTextBox_ContextMenuClosing" />
... тогда ваше событие работает так, как вы ожидаете. Все еще странно, если вы спросите меня, но в любом случае это тривиальный обходной путь, поэтому я не буду жаловаться.
M