有的时候,会遇到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 ...
随机推荐
- oracle19.3打补丁
补丁 36582781 - 数据库发布更新 19.24.0.0.240716 本文档在发布时准确无误.有关数据库版本更新 19.24.0.0.240716 的任何更改和其他信息,请参阅 My Orac ...
- 自助式BI:灵活应变的商业智能
在这个信息爆炸的时代,商业智能(BI)已经成为企业决策的必备工具.无论是哪个行业,哪个规模的企业,似乎都无法忽视这一强大工具的存在.然而,传统的BI模式往往存在着一些限制,使得企业无法灵活地应对各种业 ...
- 从龟速乘到 $Miller-Rabin$ 算法(数论算法总结)
发现自己竟然菜到不太会龟速乘,所以把 \(Miller-Rabin\) 算法所需要用到的算法全学了一遍-- 龟速乘 龟速乘是一种 \(O(\log n)\) 的乘法计算方法. 考虑有时普通乘法取模会爆 ...
- element-ui实现table表格的嵌套(table表格嵌套)功能实现
最近在做电商类型的官网,希望实现的布局如下:有表头和表身,所以我首先想到的就是table表格组件. 表格组件中常见的就是:标题和内容一一对应:像效果图中的效果,只用基础的表格布局是不行的,因此我想 ...
- Deepseek学习随笔(11)--- 普通人如何抓住DeepSeek红利(附网盘链接)
一.文档简介 这个文档是清华大学新闻与传播学院新媒体研究中心发布的<普通人如何抓住DeepSeek红利>,该文件详细介绍了DeepSeek的功能.应用场景.使用技巧以及如何通过提示词驱动提 ...
- [解决方案][docker] Http: server gave HTTP response to HTTPS client
前言 用centos运行docker不支持http,需要在daemon.json 里面配置一下 目录 没有daemon.json 需要添加这个文件 在daemon.json 增添配置 重启即可 一.l ...
- 错误修正记录: [Vivado 12-8300] Launch HLS failed! Please see vitis_hls.log for details.
起因 使用了Vivado Video Frame Buffer Read和Vivado Video Frame Buffer Write,按out of context模式综合失败.vivado版本2 ...
- Linux 安装 MySQL 8.0
目录 下载 安装数据库 修改mysql配置文件(若没有则新建) 安装并初始化mysql 查看mysql密码 配置启动 登录MySQL 修改密码 配置远程连接 配置防火墙 常见错误 Windows 安装 ...
- mysql frm、MYD、MYI数据文件恢复,导入MySQL中
前言 .frm..MYI..MYD 文件分别是 MySQL 的 MyISAM存储引擎存储的表结构.索引.数据文件. 简单方法恢复数据 .frm..MYI..MYD文件如果直接以文本打开,全部会以二进制 ...
- go 遍历修改切片数据
package main import "fmt" type good struct { id int64 sum int64 } func main() { good1 := g ...