Подтвердить что ты не робот

WPF Reset Фокусировка на кнопке Click

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

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

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

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

Спасибо, Raul

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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