2013-04-24 58 views
0

可以说我有一个布局:如何正确处理集中

Window 
    UserControl 
    UserControl 
     UserControl 
     Button 
     GridControl 
      GridCell 

,并让说,当前栅格单元具有键盘焦点。如果用户点击按钮。会向用户显示一条消息以确认操作。无论用户选择什么选择(是或否),焦点应该返回到GridControl上的CurrentCell。默认情况下,用户选择某个选项后,焦点将返回窗口(由Snoop报告)。我会假设一个被点击的Button会保留焦点,但显然不是。

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

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

+0

没有什么错误使用UI特有的代码隐藏在MVVM,所以为什么不只是重置在对话框的事件之一的重点是什么? (Unloaded,VisibilityChanged,Button.Click等) – Rachel 2013-04-24 12:56:28

+0

嗨Rachel,UI不应该处理业务规则,这可能是:IF条件,然后显示这个对话框,否则如果另一个条件,显示该对话框。这与业务有关,必须是虚拟机的一部分。它不仅仅是关于消息框,可能会有整个对话框要求一些选项。可以有一个对话框,在这个对话框中可以显示另一个对话框(如“详细信息” - >“高级”)。这需要非常复杂地跟踪每个对话框上最后使用的焦点元素是什么。这是保持焦点的唯一方法,因为它是在显示其他对话之前? – Goran 2013-04-24 21:57:48

回答

0

你可能很安全地解决这个问题,通过在你的按钮上设置FocusManager.IsFocusScope="true"或者如果有多个按钮是它们所在的父元素(例如StackPanel或其他)。

如果您使用的是RoutedCommands,有几个潜在的问题。基本上RoutedCommands并不总是按照您期望的方式工作在关注范围内。这听起来像你直接绑定到视图模型上的命令,尽管这应该不成问题。如果您想详细了解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); 
    } 
} 
+0

嗨Caleb。我试过你的解决方案,但它不起作用。它仍然关注主窗口内的第一个用户控件,就像之前一样。我认为问题在于我如何显示消息框。当点击一个按钮时,会在SomeViewModel上执行一个命令,该命令会发送一条消息,显示一个消息框,并显示该消息。此消息的全局用户是主窗口,然后显示该消息,并将执行返回给SomeViewModel。 – Goran 2013-04-24 12:36:50

+0

可能是因为主窗口是消息框的所有者,它将焦点放在第一个(也是唯一)元素(在我的情况下是它的TabControl)。 – Goran 2013-04-24 12:37:16

+0

主窗口如何显示消息框以及它如何将执行返回到视图模型? – 2013-04-24 12:42:23