TextBox теряет фокус на клавиатуре - PullRequest
2 голосов
/ 24 июня 2010

В моем приложении WPF у меня есть текстовое поле управления.Элемент управления текстового поля находится в UserControl, который, в свою очередь, имеет класс View Model.В моем классе VM у меня есть команда, которая выполняется либо при нажатии кнопки в UserControl, либо при нажатии клавиши Enter.Моя проблема в том, что когда я нажимаю Enter, текстовое поле теряет фокус, и мне приходится нажимать на текстовое поле, чтобы снова сфокусировать его.Что можно сделать, чтобы текстовое поле сохраняло фокус при нажатии клавиши?

Я пытаюсь сделать набросок того, что я сейчас использую:

<Window>  
    <uc:DesignPanel ... />
    <uc:CommandPrompt ... />  
</Window>

<UserControl Name=CommandPrompt ...>
    <StackPanel>
        <TextBox Name="tb_commands" />
        <Button Name="btn_process" FocusManager.FocusedElement="{Binding ElementName=tb_commands}" />
    </StackPanel>      
</UserControl>  

Пользовательский элемент управления DesignPanelв свою очередь содержит другие пользовательские элементы управления (UCOperands).UCOperand в основном выглядит следующим образом:

<UserControl Name="UCOperand" Focusable="true">  
    <UserControl.InputBindings ... />  
</UserControl>

Обратите внимание, что я установил Focusable = "true" в UCOperand, это необходимо, потому что в противном случае пользователь не может вызывать команды ввода, определенные в этом элементе управления.Если я удаляю это свойство или устанавливаю его в false, то все работает так, как я ожидаю, например, когда я нажимаю Enter, когда я редактирую текстовое поле «tb_commands» или нажимаю кнопку «btn_process», фокус остается на текстовом поле,Но, как и сейчас, всякий раз, когда вы нажимаете Enter или нажимаете на кнопку, tb_commands теряет фокус.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 25 июня 2010

Добавьте раскадровку с короткой продолжительностью в ваше окно и используйте событие Completed, чтобы установить фокус на текстовое поле (см. Нижнюю часть моего примера).

<Window x:Class="TextboxFocus.Views.MainView"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:uc="clr-namespace:TextboxFocus.Views" 
  KeyDown="Window_KeyDown"
  Title="Main Window" Height="400" Width="800">

  <Window.Triggers>
      <EventTrigger RoutedEvent="FrameworkElement.Loaded">
          <BeginStoryboard>
              <Storyboard BeginTime="0:0:1" Completed="Go_Completed">
              </Storyboard>
          </BeginStoryboard>
      </EventTrigger>
  </Window.Triggers>
  <DockPanel>
      <uc:CommandPrompt x:Name="UC" >
      </uc:CommandPrompt>
  </DockPanel>
</Window>


<UserControl x:Class="TextboxFocus.Views.CommandPrompt"
  Name="UCOperand" 
  Focusable="true"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Height="300" Width="300">
  <Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <TextBox Grid.Row="0" 
             x:Name="GoTextbox"/>
    <Button Grid.Row="1"  
        Content="Go"  
        FocusManager.FocusedElement="{Binding ElementName=GoTextbox}" 
        Command="{Binding GoCommand}" />
  </Grid>
</UserControl>


public partial class MainView : Window
{
  MainViewModel _mvm = new MainViewModel();

  public MainView()
  {
     InitializeComponent();

     this.DataContext = _mvm;
  }

  private void Window_KeyDown(object sender, KeyEventArgs e)
  {
     // trap the F5/Enter key and execute the query....
     if (e.Key == Key.Enter)
     {
        _mvm.GoCommand.Execute(null);
        e.Handled = true;
     }
  }

  // set focus here
  private void Go_Completed(object sender, EventArgs e)
  {
     UC.GoTextbox.Focus();
  }
}
0 голосов
/ 24 июня 2010

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

Вотобразец MSDN с именем Как: определить, когда нажата клавиша ввода

Если вы измените запись текста в этом образце на yourTextBox.Focus(), я бы предположил, что это сработает.

...