以之前的AppLog舉例

bf16e79e98618727c16c45a9f1d98de6.jpg

XAML:
<DataGrid.Resources>
    <Style TargetType="{x:Type DataGridCell}">
        <EventSetter Event="MouseDoubleClick" Handler="DataGridAppLogCell_MouseDoubleClick"/>
    </Style>
</DataGrid.Resources>

 

C#:
//while是個令人擔心會吃效能的地方,測試耗時約1~2毫秒
//觀察Cell和Row差了6層,順序如下:
//0:System.Windows.Controls.DataGridCell
//1:System.Windows.Controls.DataGridCellsPanel
//2:System.Windows.Controls.ItemsPresenter
//3:System.Windows.Controls.Primitives.DataGridCellsPresenter
//4:System.Windows.Controls.Primitives.SelectiveScrollingGrid
//5:System.Windows.Controls.Border
//6:System.Windows.Controls.DataGridRow

//在DataGridCell上雙擊
void DataGridAppLogCell_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    AppLog logData = ((DataGridCell)sender).GetItem<AppLog>();
    
    //Do something.
}

//找出DataGridCell所在的DataGridRow
//回傳DataGridRow所代表的資料
static T GetItem<T>(this DataGridCell obj) where T : class
{
    DataGridRow row = obj.FindOwner<DataGridRow>();
    return row == null ? null : (T)row.Item;
}

//找出DataGridRow
static T FindOwner<T>(this DependencyObject obj) where T : DependencyObject
{
    DependencyObject parent = VisualTreeHelper.GetParent(obj);

    while ((parent != null) && !(parent is T))
    {
        parent = VisualTreeHelper.GetParent(parent);
    }

    return parent as T;
}

創作者介紹
創作者 GNAySolution 的頭像
Yang

GNAySolution

Yang 發表在 痞客邦 留言(0) 人氣( 2 )