有的时候,会遇到DataGrid里面嵌套DataGrid(重叠嵌套),然后里面的鼠标滚轮无法响应外面的滚动,为此记录下解决方案
有的时候,会遇到DataGrid里面嵌套DataGrid(重叠嵌套),然后里面的鼠标滚轮无法响应外面的滚动,为此记录下解决方案
本实例是在DataGrid的详情行里再嵌入一个DataGrid,模拟重叠的情况,先看下效果,当然效果是不理想的

再看下优化的效果,可见效果明显,如果您有更优越的方式请勿喷,本人能力有限,也是参照网上的,特此整理下:

好了,效果看完,我主要说明下:
原理就是采用滚动方式为像素,捕获里面的DataGrid的鼠标滚轮事件,再获取到外部的DataGrid的ScrollViewer对象,将滚动的量设置给ScrollViewer即可
下面是详细代码:
1 <Window x:Class="DataGridDemo.MainWindow"
2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6 xmlns:local="clr-namespace:DataGridDemo"
7 mc:Ignorable="d"
8 Title="MainWindow" Height="450" Width="500">
9 <Window.Resources>
10 <Style TargetType="DataGrid">
11 <Setter Property="AutoGenerateColumns" Value="False" />
12 <Setter Property="CanUserAddRows" Value="False" />
13 <Setter Property="IsReadOnly" Value="True" />
14 <Setter Property="VirtualizingPanel.ScrollUnit" Value="Pixel"/>
15 </Style>
16 <DataTemplate x:Key="DataDetailsTemplate">
17 <DataGrid ItemsSource="{Binding Subs}" PreviewMouseWheel="DataGrid_PreviewMouseWheel" >
18 <DataGrid.Columns>
19 <DataGridTextColumn Header="详情名称" Binding="{Binding Name}" />
20 </DataGrid.Columns>
21 </DataGrid>
22 </DataTemplate>
23 </Window.Resources>
24 <Grid>
25 <DataGrid x:Name="data" RowDetailsTemplate="{StaticResource DataDetailsTemplate}">
26 <DataGrid.Columns>
27 <DataGridTextColumn Header="名称" Binding="{Binding Name}" />
28 </DataGrid.Columns>
29 </DataGrid>
30 </Grid>
31 </Window>
1 using System;
2 using System.Collections.Generic;
3 using System.Collections.ObjectModel;
4 using System.ComponentModel;
5 using System.Linq;
6 using System.Text;
7 using System.Threading.Tasks;
8 using System.Windows;
9 using System.Windows.Controls;
10 using System.Windows.Data;
11 using System.Windows.Documents;
12 using System.Windows.Input;
13 using System.Windows.Media;
14 using System.Windows.Media.Imaging;
15 using System.Windows.Navigation;
16 using System.Windows.Shapes;
17
18 namespace DataGridDemo
19 {
20 /// <summary>
21 /// MainWindow.xaml 的交互逻辑
22 /// </summary>
23 public partial class MainWindow : Window
24 {
25 public ObservableCollection<Info> Data = new ObservableCollection<Info>();
26
27 public MainWindow()
28 {
29 InitializeComponent();
30
31 data.ItemsSource = Data;
32
33 for (int i = 0; i < 50; i++)
34 {
35 ObservableCollection<Info> Subs = null;
36 if (i == 1)
37 {
38 Subs = new ObservableCollection<Info>();
39 for (int j = 0; j < 100; j++)
40 {
41 Subs.Add(new Info() { Name = "子项" + j });
42 }
43 }
44 Data.Add(new Info() { Name = "测试" + i, Subs = Subs });
45 }
46 }
47
48 /// <summary>
49 /// 详情里面的datagrid,鼠标滚轮滚动时
50 /// </summary>
51 /// <param name="sender"></param>
52 /// <param name="e"></param>
53 private void DataGrid_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
54 {
55 //特别提示:因为这里需要寻找指定的DataGrid的ScrollViewer,如果此处无法获取到DataGrid,可以利用FindVisualParent匹配出符合的父级进行操作
56 if (sender is DataGrid grid && data == null)
57 {
58 var gs = FindVisualParent<DataGrid>(grid);
59 data = gs.Where(c => c.Name.Equals("控件name")).FirstOrDefault();
60 }
61
62 var sc = GetVisualChild<ScrollViewer>(data);
63
64 if (sc != null)
65 {
66 sc.ScrollToVerticalOffset(sc.VerticalOffset - e.Delta);
67 }
68 }
69
70 //匹配返回符合条件的子控件
71 T GetVisualChild<T>(Visual parent) where T : Visual
72 {
73 T child = default(T);
74 int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
75 for (int i = 0; i < numVisuals; i++)
76 {
77 var v = (Visual)VisualTreeHelper.GetChild(parent, i);
78 child = v as T ?? GetVisualChild<T>(v);
79 if (child != null)
80 break;
81 }
82 return child;
83 }
84
85 //匹配返回符合条件的所有子控件
86 IEnumerable<T> FindVisualChild<T>(DependencyObject obj) where T : DependencyObject
87 {
88 try
89 {
90 List<T> TList = new List<T> { };
91 for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
92 {
93 DependencyObject child = VisualTreeHelper.GetChild(obj, i);
94 if (child != null && child is T)
95 {
96 TList.Add((T)child);
97 IEnumerable<T> childOfChildren = FindVisualChild<T>(child);
98 if (childOfChildren != null)
99 {
100 TList.AddRange(childOfChildren);
101 }
102 }
103 else
104 {
105 IEnumerable<T> childOfChildren = FindVisualChild<T>(child);
106 if (childOfChildren != null)
107 {
108 TList.AddRange(childOfChildren);
109 }
110 }
111 }
112 return TList;
113 }
114 catch (Exception ee)
115 {
116 MessageBox.Show(ee.Message);
117 return null;
118 }
119 }
120
121 //匹配返回符合条件的父控件
122 T GetVisualParent<T>(DependencyObject child) where T : Visual
123 {
124 DependencyObject parentObject = VisualTreeHelper.GetParent(child);
125
126 if (parentObject == null)
127 {
128 return null;
129 }
130
131 T parent = parentObject as T;
132 if (parent != null)
133 {
134 return parent;
135 }
136 else
137 {
138 return GetVisualParent<T>(parentObject);
139 }
140 }
141
142 //匹配返回符合条件的所有父控件
143 IEnumerable<T> FindVisualParent<T>(DependencyObject obj) where T : DependencyObject
144 {
145 try
146 {
147 List<T> TList = new List<T> { };
148 DependencyObject parent = VisualTreeHelper.GetParent(obj);
149 if (parent != null && parent is T)
150 {
151 TList.Add((T)parent);
152 IEnumerable<T> parentOfParent = FindVisualParent<T>(parent);
153 if (parentOfParent != null)
154 {
155 TList.AddRange(parentOfParent);
156 }
157 }
158 else if (parent != null)
159 {
160 IEnumerable<T> parentOfParent = FindVisualParent<T>(parent);
161 if (parentOfParent != null)
162 {
163 TList.AddRange(parentOfParent);
164 }
165 }
166 return TList;
167 }
168 catch (Exception ee)
169 {
170 MessageBox.Show(ee.Message);
171 return null;
172 }
173 }
174 }
175
176 public class Info
177 {
178 public string Name { get; set; }
179
180 public ObservableCollection<Info> Subs { get; set; }
181 }
182 }
有需要源码运行的也可以下载!
有的时候,会遇到DataGrid里面嵌套DataGrid(重叠嵌套),然后里面的鼠标滚轮无法响应外面的滚动,为此记录下解决方案的更多相关文章
- mybatis的嵌套查询(嵌套查询nested select和嵌套结果nested results查询)区别
(转自:http://blog.csdn.net/canot/article/details/51485955) Mybatis表现关联关系比hibernate简单,没有分那么细致one-to-man ...
- AJPFX实例集合嵌套之ArrayList嵌套ArrayList
案例:import java.util.ArrayList;import java.util.Iterator;import com.heima.bean.Person;public class De ...
- 代码实现集合嵌套之ArrayList嵌套ArrayList
package com.loaderman.list; import java.util.ArrayList; import com.loaderman.bean.Person; public cla ...
- Android ScrollView嵌套ViewPager,嵌套的ViewPager无法显示
记录:ScrollView嵌套ViewPager,嵌套的ViewPager无法显示 项目中所需要布局:LinearLayout中包含(orientation="vertical") ...
- easyui datagrid detailview嵌套datagrid的问题
解决问题办法来自 http://www.coding123.net/article/20141113/easyui-datagrid-datailview-use-sub-datagrid-not-a ...
- C# DataGrid嵌套DataGrid动态隐藏显示行
前端代码: <Window x:Class="DataGridPractice.MainWindow" xmlns="http://schemas.microsof ...
- EasyUI Datagrid Datetime(EasyUI DataGrid 时间格式化)
EasyUI DataGrid 时间格式化 方法一: var Common = { //EasyUI用DataGrid用日期格式化 TimeFormatter: function (value, re ...
- Flex4 中<s:Datagrid>、<mx:Datagrid>添加超链接的完整方法
<s:Datagrid>的添加超链接方法(链接文字会重叠) <s:GridColumn dataField="_fileName" headerText=&quo ...
- EasyUI 之datagrid 使用 【DataGrid属性解释】
可选的参数 DataGrid 属性 覆写了 $.fn.datagrid.defaults. 参数名 类型 描述 默认值 title string Datagrid面板的标题 null iconCls ...
- extJS4.2.0 Json数据解析,嵌套及非嵌套(二)
Ext.data.reader.Reader Readers通常用于翻译数据,使其被加载为 Model 实例或Store, 该数据一般是一个AJAX请求的响应数据. 一般情况下不需要直接创建一个Rea ...
随机推荐
- 让AI碰撞!“天翼云息壤杯”高校AI大赛江苏赛区交流会热力开场!
由中国电信集团有限公司主办,天翼云科技有限公司承办的"天翼云息壤杯"高校AI大赛正在火热进行中.为了提高江苏赛区学生的参赛热情,增强学生的创作能力,江苏电信.天翼云华东中心于12月 ...
- 彰显科技硬实力!天翼云论文在国际顶刊JoCCASA发表!
近日,由天翼云科技有限公司云网产品事业部混合云团队完成的论文<Multivariate Time Series Collaborative Compression for Monitoring ...
- Dummynet简单部署
本文分享自天翼云开发者社区<Dummynet简单部署>,作者:凸凹 部署流程 ^准备内核版本 ^参看系统内核版本 uname -r 我们需要将ipfw编译成内核模块,请确保ipfw用到的内 ...
- tar命令-大文件分卷压缩
linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的.生成tar包后,就可以用其它的程序来进行压缩.用来压缩和解压文件.ta ...
- vue集成amis
一.下载amis 方式一:git下载sdk.tar.gz,https://github.com/baidu/amis/releases 方式二:npm i amis 来下载,在 node_module ...
- 开源EFCore 对比实体与实际数据库结构的工具-GZY.EFCoreCompare
前言 GZY.EFCoreCompare 是一个用于 对比数据库结构和 EF Core 代码中的 DbContext 的库. 它基于 EF Core 的 Scaffolding 机制,生成 Datab ...
- [翻译] 为什么 Tracebit 用 C# 开发
原文: [Why Tracebit is written in C#] 作者: [Sam Cox (Tracebit联合创始人兼CTO)] 译者: [六六] (译注:Tracebit成立于2022年, ...
- [BZOJ3811] 玛里苟斯 题解
不得不说这题的确挺苟的. 注:下述"引理"表示: 对于长度为 \(n\) 的数组 \(V\),其线性基为 \(B\),定义 \(c_v=\bigoplus\limits_{a\in ...
- const char*和char*的区别
- 洋葱学园:开启高效学习之旅的宝藏 APP 40天会员5元到手价
洋葱学园是一款在在线教育领域表现出色的教学 APP ,下面为您详细介绍它的特点以及推荐理由. 丰富的学科覆盖: 洋葱学园涵盖了从小学到高中的全学科课程,包括数学.语文.英语.物理.化学等.无论您处于哪 ...