有的时候,会遇到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(重叠嵌套),然后里面的鼠标滚轮无法响应外面的滚动,为此记录下解决方案的更多相关文章

  1. mybatis的嵌套查询(嵌套查询nested select和嵌套结果nested results查询)区别

    (转自:http://blog.csdn.net/canot/article/details/51485955) Mybatis表现关联关系比hibernate简单,没有分那么细致one-to-man ...

  2. AJPFX实例集合嵌套之ArrayList嵌套ArrayList

    案例:import java.util.ArrayList;import java.util.Iterator;import com.heima.bean.Person;public class De ...

  3. 代码实现集合嵌套之ArrayList嵌套ArrayList

    package com.loaderman.list; import java.util.ArrayList; import com.loaderman.bean.Person; public cla ...

  4. Android ScrollView嵌套ViewPager,嵌套的ViewPager无法显示

    记录:ScrollView嵌套ViewPager,嵌套的ViewPager无法显示 项目中所需要布局:LinearLayout中包含(orientation="vertical") ...

  5. easyui datagrid detailview嵌套datagrid的问题

    解决问题办法来自 http://www.coding123.net/article/20141113/easyui-datagrid-datailview-use-sub-datagrid-not-a ...

  6. C# DataGrid嵌套DataGrid动态隐藏显示行

    前端代码: <Window x:Class="DataGridPractice.MainWindow" xmlns="http://schemas.microsof ...

  7. EasyUI Datagrid Datetime(EasyUI DataGrid 时间格式化)

    EasyUI DataGrid 时间格式化 方法一: var Common = { //EasyUI用DataGrid用日期格式化 TimeFormatter: function (value, re ...

  8. Flex4 中<s:Datagrid>、<mx:Datagrid>添加超链接的完整方法

    <s:Datagrid>的添加超链接方法(链接文字会重叠) <s:GridColumn dataField="_fileName" headerText=&quo ...

  9. EasyUI 之datagrid 使用 【DataGrid属性解释】

    可选的参数 DataGrid 属性 覆写了 $.fn.datagrid.defaults. 参数名 类型 描述 默认值 title string Datagrid面板的标题 null iconCls ...

  10. extJS4.2.0 Json数据解析,嵌套及非嵌套(二)

    Ext.data.reader.Reader Readers通常用于翻译数据,使其被加载为 Model 实例或Store, 该数据一般是一个AJAX请求的响应数据. 一般情况下不需要直接创建一个Rea ...

随机推荐

  1. oracle19.3打补丁

    补丁 36582781 - 数据库发布更新 19.24.0.0.240716 本文档在发布时准确无误.有关数据库版本更新 19.24.0.0.240716 的任何更改和其他信息,请参阅 My Orac ...

  2. 自助式BI:灵活应变的商业智能

    在这个信息爆炸的时代,商业智能(BI)已经成为企业决策的必备工具.无论是哪个行业,哪个规模的企业,似乎都无法忽视这一强大工具的存在.然而,传统的BI模式往往存在着一些限制,使得企业无法灵活地应对各种业 ...

  3. 从龟速乘到 $Miller-Rabin$ 算法(数论算法总结)

    发现自己竟然菜到不太会龟速乘,所以把 \(Miller-Rabin\) 算法所需要用到的算法全学了一遍-- 龟速乘 龟速乘是一种 \(O(\log n)\) 的乘法计算方法. 考虑有时普通乘法取模会爆 ...

  4. element-ui实现table表格的嵌套(table表格嵌套)功能实现

      最近在做电商类型的官网,希望实现的布局如下:有表头和表身,所以我首先想到的就是table表格组件. 表格组件中常见的就是:标题和内容一一对应:像效果图中的效果,只用基础的表格布局是不行的,因此我想 ...

  5. Deepseek学习随笔(11)--- 普通人如何抓住DeepSeek红利(附网盘链接)

    一.文档简介 这个文档是清华大学新闻与传播学院新媒体研究中心发布的<普通人如何抓住DeepSeek红利>,该文件详细介绍了DeepSeek的功能.应用场景.使用技巧以及如何通过提示词驱动提 ...

  6. [解决方案][docker] Http: server gave HTTP response to HTTPS client

    前言 用centos运行docker不支持http,需要在daemon.json 里面配置一下 目录 没有daemon.json 需要添加这个文件 在daemon.json 增添配置 重启即可 一.l ...

  7. 错误修正记录: [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 ...

  8. Linux 安装 MySQL 8.0

    目录 下载 安装数据库 修改mysql配置文件(若没有则新建) 安装并初始化mysql 查看mysql密码 配置启动 登录MySQL 修改密码 配置远程连接 配置防火墙 常见错误 Windows 安装 ...

  9. mysql frm、MYD、MYI数据文件恢复,导入MySQL中

    前言 .frm..MYI..MYD 文件分别是 MySQL 的 MyISAM存储引擎存储的表结构.索引.数据文件. 简单方法恢复数据 .frm..MYI..MYD文件如果直接以文本打开,全部会以二进制 ...

  10. go 遍历修改切片数据

    package main import "fmt" type good struct { id int64 sum int64 } func main() { good1 := g ...