如何正确处理集中
可以说我有一个布局:如何正确处理集中
Window
UserControl
UserControl
UserControl
Button
GridControl
GridCell
,并让说,当前栅格单元具有键盘焦点。如果用户点击按钮。会向用户显示一条消息以确认操作。无论用户选择什么选择(是或否),焦点应该返回到GridControl上的CurrentCell。默认情况下,用户选择某个选项后,焦点将返回窗口(由Snoop报告)。我会假设一个被点击的Button会保留焦点,但显然不是。
处理按钮命令在ViewModel(MVVM)中完成。
如何将键盘焦点返回到网格中的当前单元格?
你可能很安全地解决这个问题,通过在你的按钮上设置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);
}
}
嗨Caleb。我试过你的解决方案,但它不起作用。它仍然关注主窗口内的第一个用户控件,就像之前一样。我认为问题在于我如何显示消息框。当点击一个按钮时,会在SomeViewModel上执行一个命令,该命令会发送一条消息,显示一个消息框,并显示该消息。此消息的全局用户是主窗口,然后显示该消息,并将执行返回给SomeViewModel。 – Goran 2013-04-24 12:36:50
可能是因为主窗口是消息框的所有者,它将焦点放在第一个(也是唯一)元素(在我的情况下是它的TabControl)。 – Goran 2013-04-24 12:37:16
主窗口如何显示消息框以及它如何将执行返回到视图模型? – 2013-04-24 12:42:23
没有什么错误使用UI特有的代码隐藏在MVVM,所以为什么不只是重置在对话框的事件之一的重点是什么? (Unloaded,VisibilityChanged,Button.Click等) – Rachel 2013-04-24 12:56:28
嗨Rachel,UI不应该处理业务规则,这可能是:IF条件,然后显示这个对话框,否则如果另一个条件,显示该对话框。这与业务有关,必须是虚拟机的一部分。它不仅仅是关于消息框,可能会有整个对话框要求一些选项。可以有一个对话框,在这个对话框中可以显示另一个对话框(如“详细信息” - >“高级”)。这需要非常复杂地跟踪每个对话框上最后使用的焦点元素是什么。这是保持焦点的唯一方法,因为它是在显示其他对话之前? – Goran 2013-04-24 21:57:48