我在用户控件中有以下文本框。
<!-- This is the user input TextBox, users type commands here and hit enter or press the send command button -->
<TextBox Text="{Binding CommandText}" Background="Transparent" BorderBrush="{StaticResource brushWatermarkBorder}" Name="txtUserEntry">
<TextBox.InputBindings>
<KeyBinding Command="{Binding BindKeyCommand}"
CommandParameter="{Binding ElementName=txtUserEntry, Path=Text}"
Key="Return"
Modifiers=""/>
</TextBox.InputBindings>
</TextBox>
和按钮。
<!-- This button serves as an alternative to hitting the enter key with text box focus. -->
<Button Command="{Binding BindKeyCommand}" CommandParameter="{Binding ElementName=txtUserEntry, Path=Text}" Grid.Column="2">
<TextBlock>
Send Command
</TextBlock>
</Button>
当用户键入框并使用返回键也发送命令时,命令将成功通过BindKeyCommand发送(弹出一个消息框以确认此信息)并在文本框中保留焦点。
但是,当使用Button发送命令时,该命令再次成功,但对文本框的关注将丢失。
我试图实施答案here,但都无济于事。有人可以向我解释一下,如何正确地实现这里的答案,包括放在视图模型中的内容,或者,另一种方法是,在按下按钮时,键盘焦点被分配回文本框。重要的是要注意,就像在链接的问题中一样,我正在使用MVVM。
更新:尝试通过DT Sawant执行步骤
第1步:
ApplicationName.Tools.FocusExtension包含排名第二的答案中的所有文本。扩展名在ApplicationName.Tools命名空间
中第2步:
添加了新属性;
private bool isTxtUserEntryFocused = false;
public bool IsTxtUserEntryFocused
{
get
{
return isTxtUserEntryFocused;
}
set
{
isTxtUserEntryFocused = value;
OnPropertyChanged("IsTxtUserEntryFocused");
}
}
第3步:
添加了命名空间参考; xmlns:Tools =“clr-namespace:WPFLocalDataConnect.Tools”
第4步:
绑定IsFocused属性;工具:FocusExtension.IsFocused =“{Binding IsTxtUserEntryFocused}”
第5步:
因此在viewmodel中初始化;
public void ExecuteBindKeyCommand(string param)
{
if (String.IsNullOrWhiteSpace(param))
{
MessageBox.Show("No command given.");
this.CommandText = string.Format("");
IsTxtUserEntryFocused = true;
}
else
{
MessageBox.Show(string.Format("CommandInvoked: {0}", param));
History = string.Format("{0} {2} {1}", History, param, Environment.NewLine);
this.CommandText = string.Format("");
IsTxtUserEntryFocused = true;
}
}
现在所有步骤都已完成我测试了项目。它没有用,但需要注意一些有趣的事情;
按下按钮而不首先聚焦文本框会导致“无命令”消息,然后焦点移动到文本框。单击文本框后按下按钮,输入或不输入文本分别导致“无命令”或“命令调用”消息,然后没有焦点移动到文本框。这太令人困惑了。
答案 0 :(得分:0)
您可以在后面的代码中执行类似的操作来设置焦点
<Button Click="MyButton_Click" Name="MyButton" Command="{Binding BindKeyCommand}" CommandParameter="{Binding ElementName=txtUserEntry, Path=Text}" Grid.Column="2" >
<TextBlock>
Send Command
</TextBlock>
private void MyButton_Click(object sender, RoutedEventArgs e)
{
Dispatcher.BeginInvoke(DispatcherPriority.ContextIdle, new Action(() => txtUserEntry.Focus()));
}
答案 1 :(得分:0)
你试图在帮助下解决你的问题 this链接。我将解释实现相同解决方案的步骤:
步骤1:添加上面链接中给出的新类FocusExtension。
第2步:在viewmodel中添加新属性IsTxtUserEntryFocused(您可以提供任何名称)
步骤3:在XAML中添加FocusExtension类的命名空间引用
步骤4:将FocusExtension类的IsFocused属性绑定到viewmodel属性。 如下图所示:
<TextBox local:FocusExtension.IsFocused="{Binding IsTxtUserEntryFocused}" />
步骤5:现在在您的按钮命令中,您可能已在视图模型中实现了该命令。 初始化
IsTxtUserEntryFocused=true.
由于您的显示消息框,焦点不会保留在文本框上。 所以焦点转到消息框,它不会回到你的窗口。
您应该在显示消息框后添加此行
Application.Current.MainWindow.Focus();//Bring focus to your window where text box is present
那就是它。