WPF DataGrid点击有效区域Check

1、DataGrid注册左键事件,点击有效区域Check

//在窗体Load中增加
this.dataGrid.AddHandler(DataGrid.MouseLeftButtonDownEvent, new MouseButtonEventHandler(this.DataGrid_MouseLeftSingleButtonDown), true);

//添加右键事件
private void DataGrid_MouseLeftSingleButtonDown(){
    if(Utility.ignoreDataGridMouseLeftSingleButtonDown(sender,e) == false){
        SelectedChange();
    }		
} 

//DataGrid 点击检查判断
//用户是否点击在了DataGrid有效区域,而不是表格内空白,滚动条,列名等无效区域
//返回值true:忽略该鼠标点击事件
public static bool ignoreDataGridMouseLeftSingleButtonDown(object sender,MouseButtonEventArgs e){
    DataGrid grid = sender as DataGrid;
    if(grid == null || (grid.DataContext == null && grid.ItemsSource == null)){
        return true;
    }
    bool isDataContextNull = false;
    if(grid.DataContext == null && grid.ItemsSource != null){
        isDataContextNull = true;
        grid.DataContext = grid.ItemsSource;
    }
    bool ignored = false;
    Point p = e.GetPosition(grid);
    if(grid.VerticalScrollBarVisibility == ScrollBarVisibility.Visible){
        if(p.X > grid.ActualWidth - SystemParameters.VerticalScrollBarWidth){
            ignored = true;
        }
    }
    
    if(ignored == false && grid.HorizontalScrollBarVisibility == ScrollBarVisibility.Visible){
        if(p.Y > grid.ActualHeight - SystemParameters.HorizontalScrollBarWidth ||
           p.Y < grid.ColumnHeaderHeight){
            ignored = true;
        }
    }
    
    //点击在表头
    if(ignored == false){
        DataGridColumnHeadersPresenter headerPresenter = FindVisualChild<DataGridColumnHeadersPresenter>(grid);
        if(p.Y < headerPresenter.ActualHeight){
            ignored = true;
        }
    }
    
    //数据行是否显示满了 是否有空白区域
    if(ignored == false){
        //其绑定的上下文不是一个List类型
        if(grid.DataContext.GetType().GetProperty("Count") ==null){
           if(isDataContextNull){
               grid.DataContext = null;
           } 
            return ture;
        }
         //如果有数据  计算是否点在空白区域
    int count;
    if(int.TryParse(grid.DataContext.GetType().GetProperty("Count").GetValue(grid.DataContext).ToString(), out count)){
        double totalHeight = 0;
        for(int i=0;i<count ; i++){
            DataGridRow row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(i);
            if(row != null){
                totalHeight += row.ActualHeight;
            }
        }
        if(totalHeight +grid.ColumnHeaderHeight < p.Y){
           ignored = true; 
        }
    }       
    }
    if(isDataContextNull){
        grid.DataContext = null;
    }
    return ignored;   
}

public static T FindVisualChild<T>(DependencyObject current) where T :DependencyObject{
    if(current == null) return null;
    int childCount = VisualTreeHelper.GetChildrenCount(current);
    for(int i=0; i< childCount; i++){
       DependencyObject child = VisualTreeHelper.GetChild(current, i);
        if(child is T)return (T)child;
        T result = FindVisualChild<T>(child);
        if(result != null) return result;        
    }
    return null;
}

posted @ 2021-03-11 09:03  DingGuo  阅读(396)  评论(0编辑  收藏  举报