在我的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都会失去焦点。
提前致谢。
答案 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();
}
}