假设我有下一个布局:
Window
UserControl
UserControl
UserControl
Button
GridControl
GridCell
让我们说GridCell目前有键盘焦点。如果用户点击按钮。向用户显示一条消息以确认操作。无论用户选择何种选择(是或否),焦点都应返回到GridControl上的CurrentCell。默认情况下,在用户选择某个选项后,焦点将返回到Window(由Snoop报告)。我会假设点击的按钮会保留焦点,但显然不是。
按钮的处理命令在ViewModel(MVVM)中完成。
如何将键盘焦点返回到网格中的当前单元格?
答案 0 :(得分:0)
您可以通过在按钮上设置FocusManager.IsFocusScope="true"
或者如果有多个按钮来处理父元素(例如StackPanel
或其他),可以非常安全地解决此问题。
如果您使用RoutedCommands
,可能存在一些潜在问题。基本上RoutedCommands
并不总是按照您期望的方式在焦点范围内工作。听起来您直接绑定到View Model上的命令,但这应该不是问题。如果您想详细了解RoutedCommand
问题检查this code project article out。
以下是我验证此作品的示例代码,供您参考。
XAML:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid Margin="25">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<!--You could also have the FocusManager.IsFocusScope set on the Border instead-->
<Border Margin="0,0,0,15">
<Button FocusManager.IsFocusScope="True" Click="ButtonBase_OnClick">Click me!</Button>
</Border>
<TextBox Grid.Row="1" x:Name="MessageTextBox"></TextBox>
</Grid>
</Window>
C#:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
MessageBox.Show("Clicked, message: " + MessageTextBox.Text);
}
}