WPF Сбросить фокус при нажатии кнопки - PullRequest
34 голосов
/ 13 января 2010

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

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

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

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

Спасибо, Raul

Ответы [ 2 ]

33 голосов
/ 17 мая 2011

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

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

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

25 голосов
/ 13 января 2010

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

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

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

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