有的时候,会遇到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. 从存钱罐到子数组:一个关于累加和的精妙问题|LeetCode 560 和为K的子数组

    LeetCode 560 和为K的子数组 点此看全部题解 LeetCode必刷100题:一份来自面试官的算法地图(题解持续更新中) 生活中的算法 你有没有这样的经历:每天往存钱罐里存一些零钱,某一天突 ...

  2. RabbitMq消息过期时间TTL介绍

    概述: 在rabbitmq中我们可以给消息设定过期时间LLT(Time to Live),在消息发送后过期时间段内未被消费,则系统会将其删除,被删除的消息将会进入死信队列.关于设置消息的过期时间有两种 ...

  3. 使用MTR网络诊断

    安装 MTR Ubuntu: apt update apt upgrade apt install mtr-tiny CentOS: yum update yum install mtr 使用 MTR ...

  4. Hive源码解析环境搭建

    一.准备工作 1.1  下载地址 https://github.com/apache/hive https://dlcdn.apache.org/hive/ 版本:2.3.9 1.2 环境依赖 had ...

  5. 中国最难入职的IT公司排行榜

    在IT行业竞争日益白热化的今天,头部企业的招聘门槛不断刷新求职者的认知.根据最新行业调研和招聘数据,我们整理出2025年中国最难入职的几家互联网公司,并揭秘其背后严苛的选拔逻辑. 通常衡量难不难,会从 ...

  6. [BZOJ4665] 小w的喜糖 题解

    我们先假设同种糖间存在差异. 设 \(f_{i,j}\) 表示前 \(i\) 种糖至少有 \(j\) 人拿到的糖和原来一样,\(c_i\) 表示拿第 \(i\) 种糖的人的个数,则有: \[f_{i, ...

  7. 第二届獬豸杯wp

    第二届獬豸杯wp 容器密码:}2N|n_yxdt!G/Ru}|_zdn$@?6@CD8E 计算机和手机部分已经在第二届 獬豸杯-复现 - 萧瑟迪亲传大弟子 - 博客园这里发过了,服务器部分自己又写了一 ...

  8. Web前端入门第 14 问:HTML 语义化是什么?

    HELLO,这里是大熊学习前端开发的入门笔记. 本系列笔记基于 windows 系统. 语义化:通俗地说,就是让机器可以理解编写出来的 HTML 代码.比如:搜索引擎.屏幕阅读器等. 非语义化写法 网 ...

  9. Netty基础—3.基础网络协议

    大纲 1.网络基础的相关问题总结 2.七层模型和四层模型 3.物理层(网线 + 光缆 + 01电信号) 4.数据链路层(以太网协议 + 网卡mac地址) 5.网络层(IP协议 + 子网划分 + 路由器 ...

  10. HTTP 尝试获取 Client IP

    HTTP 中获取 Client IP 相关策略需求, 在当下网络环境中多数只能提供建议作用. 更多的是 通过其它唯一标识来挖掘更多潜在价值. 本文主要就一个内容, 如何最大可能尝试在 HTTP 请求中 ...