如何正确处理焦点

时间:2013-04-24 11:39:51

标签: wpf mvvm wpf-controls wpf-4.0

假设我有下一个布局:

Window
  UserControl
    UserControl
      UserControl
        Button
        GridControl
          GridCell

让我们说GridCell目前有键盘焦点。如果用户点击按钮。向用户显示一条消息以确认操作。无论用户选择何种选择(是或否),焦点都应返回到GridControl上的CurrentCell。默认情况下,在用户选择某个选项后,焦点将返回到Window(由Snoop报告)。我会假设点击的按钮会保留焦点,但显然不是。

按钮的处理命令在ViewModel(MVVM)中完成。

如何将键盘焦点返回到网格中的当前单元格?

1 个答案:

答案 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);
    }
}