TextBox失去了对Key Command的关注

时间:2010-06-24 14:17:41

标签: wpf textbox focus

在我的WPF应用程序中,我有一个文本框控件。文本框控件位于UserControl中,而UserControl又具有View Model类。在我的VM类中,我有一个Command,当在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>

请注意,我在UCOperand上设置了Focusable =“true”,这是必需的,否则用户无法调用此控制中定义的输入命令。如果我删除此属性或将其设置为false,那么一切都可以正常工作,例如当我在编辑“tb_commands”文本框时按Enter键或单击“btn_process”按钮时,焦点将保留在文本框中。但就像现在一样,无论何时按Enter或单击按钮,tb_commands都会失去焦点。

提前致谢。

2 个答案:

答案 0 :(得分:0)

我不确定是否有某种方法可以让它保持焦点,但是你应该能够在发生这种情况时进行处理,然后你可以将焦点设置回TextBox

这是一个名为How to: Detect When the Enter Key Pressed

的MSDN示例

如果您将该示例中的文字写入yourTextBox.Focus(),我认为它会起作用。

答案 1 :(得分:0)

向窗口添加一个持续时间较短的故事板,并使用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();
  }
}