你可能很安全地解决这个问题,通过在你的按钮上设置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);
}
}
没有什么错误使用UI特有的代码隐藏在MVVM,所以为什么不只是重置在对话框的事件之一的重点是什么? (Unloaded,VisibilityChanged,Button.Click等) – Rachel 2013-04-24 12:56:28
嗨Rachel,UI不应该处理业务规则,这可能是:IF条件,然后显示这个对话框,否则如果另一个条件,显示该对话框。这与业务有关,必须是虚拟机的一部分。它不仅仅是关于消息框,可能会有整个对话框要求一些选项。可以有一个对话框,在这个对话框中可以显示另一个对话框(如“详细信息” - >“高级”)。这需要非常复杂地跟踪每个对话框上最后使用的焦点元素是什么。这是保持焦点的唯一方法,因为它是在显示其他对话之前? – Goran 2013-04-24 21:57:48