Как я могу сказать, когда контекстное меню textbox по умолчанию собирается открыть или закрыть?
Как я могу сказать, когда контекстное меню textbox по умолчанию собирается открыть (до его открытия) или после его закрытия (не до, после)? События ContextMenuOpening и ContextMenuClosing, похоже, не срабатывают, когда я использую стандартное встроенное меню. Я предполагаю, что я мог бы просто воссоздать меню и заполнить его стандартными командами, но это кажется немного излишним.
причина этого, в частности, в том, что у меня есть шаблонный элемент управления с заменой текстового поля в режиме "редактировать". Этот элемент управления автоматически выпадает из режима редактирования, когда текстовое поле теряет фокус. Проблема в том, что когда всплывает контекстное меню, текстовое поле теряет фокус, и, таким образом, оно выпадает из режима редактирования, и контекстное меню мгновенно исчезает.
то, что я хочу сделать,-это перед открытием контекстного меню установить флаг на код события короткого замыкания LostFocus в текстовом поле. Тогда после контекстное меню закрывается, мне нужно очистить этот флаг, но мне также нужно определить, если элемент управления, который теперь имеет фокус, по-прежнему является textbox, а если нет, то обрабатывайте код, как будто он потерял фокус. (В качестве альтернативы я мог бы проверить событие до его закрытия, если бы знал, какой элемент управления будет имейте фокус, как только он закроется. Он достигнет того же эффекта.)
это необходимо для обработки конкретного случая, если кто-то показывает контекстное меню (и как таковое текстовое поле технически больше не имеет фокуса), но затем нажимает в другом месте пользовательского интерфейса, который отклоняет контекстное меню, потому что мне нужно обнаружить, что текстовое поле фактически потеряло фокус, и поэтому элемент управления должен выйти из режима редактирования. Но если пользователь отклоняет контекстное меню, щелкнув назад в текстовом поле, я не хочу, чтобы это событие LostFocus срабатывало.
смысл?
M
UPDATE: технически на этот вопрос не было ответа, хотя я отметил его как таковой, поскольку ответчики помогли мне решить мою проблему. Но что касается фактического вопрос здесь, похоже, что ответ "Вы не можете".
хорошая новость заключается в том, что контекстное меню textbox по умолчанию-это всего три стандартных элемента, его легко дублировать, добавляя это к ресурсам где-то...
<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
2 ответов
при открытии контекстного меню текстового поля текстовое поле теряет фокус клавиатуры, но сохраняет логический фокус. Другими словами, его событие LostKeyboardFocus будет срабатывать, но его событие LostFocus не будет. Свойство isfocused текстового поля остается true при открытии контекстного меню. Основываясь на вашем описании проблемы, вы должны иметь возможность полагаться на логический фокус, чтобы определить, когда завершить "режим редактирования" в вашем элементе управления.
по умолчанию a TextBox
по-прежнему сообщает true для IsFocused
в то время как контекстное меню по умолчанию открыто, но сообщает false для IsKeyboardFocused
. То есть, LostFocus
не поднимается на TextBox
когда контекстное меню открыто, но будет поднято, если контекстное меню закрыто, выбрав другой элемент управления. Это именно то поведение, которое вы ищете.
вы можете показать это поведение по умолчанию с небольшую тестовую программу:
<Grid>
<StackPanel>
<TextBox Text="Some text one"
GotFocus="TextBox_GotFocus"
LostFocus="TextBox_LostFocus"/>
<TextBox Text="Some text two"/>
</StackPanel>
</Grid>
и кодом:
private void TextBox_GotFocus(object sender, RoutedEventArgs e)
{
Debug.WriteLine("GotFocus");
}
private void TextBox_LostFocus(object sender, RoutedEventArgs e)
{
Debug.WriteLine("LostFocus");
}
если вы не получаете это поведение по умолчанию в контексте вашего большего приложения,то может возникнуть проблема с областью фокусировки.