2010-01-12 3 views
32

У меня есть TextBox и ToolBar с Button. Если я набираю TextBox, и я нажимаю Button, я хочу, чтобы TextBox потерял Focus, чтобы привязка обновилась. Я не хочу добавлять UpdateSourceTrigger=PropertyChanged в мой TextBox. Но вместо этого, когда я нажимаю на Button, я возвращаю Focus в главное окно, так что когда-либо я теряю Focus и обновляет привязки.WPF Сброс фокуса на кнопке Нажмите

Я попытался добавить OnClick на кнопку со следующим, но это не похоже на работу:

private void Button_Click(object sender, RoutedEventArgs e) { 
     FocusManager.SetFocusedElement(this, null); 
    } 

Любые советы будут оценены.

Спасибо, Рауль

ответ

25

Проблема заключается в том, что панель инструментов помещает свою кнопку в другом FocusManager.FocusScope. Это означает, что как Button, так и TextBox могут получать логический фокус в одно и то же время, каждый в своей области. Обычно это хорошо, поскольку вы обычно не хотите терять фокус в области основного окна при выборе пунктов меню и кнопок ToolBar, но в вашем случае это предотвращает то, что вы делаете, работая.

Хотя вы можете переопределить свойство FocusManager.IsFocusScope на панели инструментов и получить эффект, который вы хотите, это, вероятно, не самый лучший план, поскольку он заставит все остальные кнопки панели инструментов также украсть фокус из области вашего основного окна.

Вместо этого вы можете использовать один из нескольких простых решений:

  • Положите вашу кнопку вне панели
  • Добавить Focusable = «истинное» управление вашей основной области окна и фокус, когда кнопка нажата
  • вручную принудительно обновить, вызвав textBox.GetBindingExpression(TextBox.TextProperty).UpdateSource()
  • Временно установить Focusable = «истина» на элементе управления в главном окне, установите фокус на него, то немедленно Focusable = «ложь» снова
+0

Я пробовал Keyboard.Focus (mainWindow); но это тоже не меняет фокуса. Он остается в текстовом поле или в любом элементе. На данный момент я просто принудительно заставляю элемент UpdateSource(), но это не похоже на долгосрочное устойчивое решение. Я попробую добавить элемент управления призраком, чтобы установить фокус. – HaxElit

+1

'Keyboard.Focus (mainWindow)' будет работать только в том случае, если «mainWindow» является Focusable (по умолчанию это не так), и если он находится в том же «FocusScope», что и «TextBox». Попробуйте создать 'Focusable =" true "' control в том же контейнере, что и TextBox, и сосредоточьте это. Другой элемент управления может быть простым ''. Поскольку 'Control' не имеет шаблона по умолчанию, он будет невидим. –

+0

Удивительный! Это работало как шарм. Спасибо! – HaxElit

32

Я столкнулся с аналогичной проблемой. Мне нужно сфокусировать текстовое поле при нажатии клавиши ввода. Я получаю код:

var scope = FocusManager.GetFocusScope(elem); // elem is the UIElement to unfocus 
FocusManager.SetFocusedElement(scope, null); // remove logical focus 
Keyboard.ClearFocus(); // remove keyboard focus 

Я думаю, что он чище, чем создание фиктивных элементов управления, и его можно использовать повторно. Однако я не уверен в этом решении. Но это работает хорошо.

+3

+1 Работает как очарование в контроле GotFocus() Событие. –

+3

Это сработало для меня, когда ничто другое не заставит DatePicker анализировать введенный текст при нажатии кнопки сохранения на панели инструментов. Код ниже использует представление (MVVM) как this.owner, вызванное из ViewModel. var t = (DependencyObject) FocusManager.GetFocusedElement (this.Owner); var scope = FocusManager.GetFocusScope (t); FocusManager.SetFocusedElement (scope, null); – Dave

Смежные вопросы