2014-03-31 86 views
1

我正在嘗試爲SilverLight DataGrid(sdk:DataGrid)創建Tab鍵導航。正如你所知道的DataGrid有沒有這樣的導航,但如果按F2,編輯單元格之後,你按Tab那麼下一個單元格將在編輯模式中選擇:在編輯模式下的Tab鍵導航SilverLight DataGrid

http://imgur.com/kMdh7sH

的形象描述:我已經選擇了第一行的第二列(Name),我編輯了這個單元格(按下F2),之後我按下了Tab,正如你所看到的,在編輯模式下選擇了下一個單元格。

但實際上我B列包含ButtonImage(不幸的是,現在我對電腦不工作,我無法證明我與Button的DataGrid),如果我按F2Date細胞之後,我按Tab然後Button下一個單元格消失,我無法繼續使用箭頭或Tab導航(好像DataGrid掛起)。

如果我重寫DatGrid.KeyUp:

void MyGrid_KeyUp(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Tab) 
    { 
    //do nothing    
    } 
} 

然後DataGrid中有一個像前面一樣的行爲,如果我使用F2Tab

我怎樣才能做到以下幾點:

1)按F2; 2)如果在F2之後按Tab,則下一個單元不會像本例那樣進入編輯模式。我希望在Tab之後的下一個單元格只會在沒有編輯的情況下進行集中,就像我使用鼠標點擊單元格一樣。

謝謝!

P.S.如果我重寫LostFocus

void MyGrid_LostFocus(object sender, RoutedEventArgs e) 
{ 
    MyGrid.CommitEdit(); 
} 

它不包含Button列解決問題。

回答

0

我已經解決了使用CurrentCellChanged的問題,請參見下面的示例代碼:

/// <summary> 
/// Checks if current column contains graphic elements, focuses next cell of next column. 
/// </summary> 
/// <param name="dg">Source DataGrid</param> 
private static void CurrentCellChangedHandler(DataGrid dg) 
{ 
    if (isCurrentCellContainsGraphicElement(dg)) 
    { 
    FocusNextCell(dg); 
    } 
} 

/// <summary> 
/// Checks if current cell contains a graphic element. 
/// </summary> 
/// <param name="dg">Source DataGrid</param> 
/// <returns>true if current column contains graphic elements, else - false</returns> 
private static bool isCurrentCellContainsGraphicElement(DataGrid dg) 
{ 
    var box = DataGridExcelNavigation.GetCellItem<TextBox>(dg.SelectedItem, dg.CurrentColumn); 

    if (box != null) return false; 

    return true; 
} 

private static T GetCellItem<T>(object item, DataGridColumn column) where T : class 
{ 
    if (item == null) return null; 

    var cellData = (column.GetCellContent(item) as T); 
    if (cellData == null) 
    { 
    var gridData = (column.GetCellContent(item) as Panel); 
    if (gridData != null) 
    { 
     cellData = (gridData.Children.Where(x => x.GetType() == typeof(T)).FirstOrDefault() as T); 
    } 
    } 
    return cellData; 
}