你可能很安全地解決這個問題,通過在你的按鈕上設置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