2013-04-24 77 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