2012-05-09 75 views
4

我目前有一個rowdetailstemplate數據網格,其中包含另一個數據網格顯示父子關係。第二個網格有一個列,其中包含一個按鈕,點擊後會顯示另一個對話框。wpf RowDetailsTemplate焦點

第一次顯示某行的詳細信息時,用戶必須在子網格中單擊一次才能獲得焦點/激活它,然後再次單擊以激發按鈕單擊事件。這隻在第一次顯示一行時發生。

這就像第一次點擊被網格吞噬。 我試圖捕獲RowDetailsVisibilityChanged事件來嘗試和集中按鈕,但它似乎仍然沒有解決問題。

任何想法?

+3

您的RowDetails DataGrid是否有多行?如果是這樣,你是否有與所有行相同的問題?我懷疑你有這裏相同的問題:http://stackoverflow.com/questions/7415988/wpf-datagrid-issue –

+0

曾嘗試設置「focusEnabled = true」? – code90

+1

@Meleak謝謝你的建議。我的datagrid的確有不止一行。不過,該帖子中的建議似乎無法解決我的問題。 rowdetails會自動展開,並在第一次點擊一個細節時,需要點擊2個點擊包含在其中的按鈕。但是,如果我手動循環詳細信息(關閉並重新顯示它們),則只需點擊一次即可。 – seanzi

回答

4

我會回答我自己的評論,也可能幫助其他人。 以下MSDN條目解釋和解決問題: http://social.msdn.microsoft.com/Forums/vstudio/en-US/2cde5655-4b8d-4a12-8365-bb0e4a93546f/activating-input-controls-inside-datagrids-rowdetailstemplate-with-single-click?forum=wpf

的問題是,總是顯示一行細節,首先需要獲得的焦點。 爲了避免這個問題,需要一個DataGrid預覽處理程序:

<DataGrid.RowStyle> 
    <Style TargetType="{x:Type DataGridRow}" BasedOn="{StaticResource {x:Type DataGridRow}}"> 
     <EventSetter Event="PreviewMouseLeftButtonDown" Handler="SelectRowDetails"/> 
    </Style> 
</DataGrid.RowStyle> 

注:我已經擴展它,因爲它破壞了我的自定義DataGridRow風格繼承目前使用的一個。

處理程序本身是

private void SelectRowDetails(object sender, MouseButtonEventArgs e) 
{ 
    var row = sender as DataGridRow; 
    if (row == null) 
    { 
     return; 
    } 
    row.Focusable = true; 
    row.Focus(); 

    var focusDirection = FocusNavigationDirection.Next; 
    var request = new TraversalRequest(focusDirection); 
    var elementWithFocus = Keyboard.FocusedElement as UIElement; 
    if (elementWithFocus != null) 
    { 
     elementWithFocus.MoveFocus(request); 
    } 
} 

這將焦點設置到的行詳細信息的內容,解決了點擊兩次的問題。

注意:這一切都取自MSDN線程,它不是我自己的解決方案。

1

我找到了一個很好的解決方案:d

我的代碼一行,解決了這個問題,但10日線來形容是什麼問題。 這裏是解決方案:

protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e) 
    { 
     base.OnPropertyChanged(e); 

     // to stop RowDetails from eating the first click. 
     if (e.Property.Name == "SelectedItem" && CurrentItem == null) CurrentItem = SelectedItem; 
    } 

,並找到細節here請。

+1

這是一種方法,但有些細節會有所幫助; 這通過派生一個類表單DataGrid解決了這個問題,然後每當網格屬性發生變化時將SelectedItem和CurrentItem同步。這樣做的效果是所選項目始終具有焦點。這個缺點是與其他解決方案相比,這是非常浪費的。 –

+0

好啊..說「解決方案」是如此的卑鄙:D – Ashi