还有的时候,会遇到DataGrid里面嵌套DataGrid(重叠嵌套),然后里面的鼠标滚轮无法响应外面的滚动,为此记录下解决方案
与上一篇区别在于,详情里面的模板通常是通用的,被定义在样式文件中,被重复使用,因此无法为其添加后台代码,如果能添加后台代码,请翻阅第一篇;所以需要用到命令的方式来辅助事件的抛出,当然还可以利用第三方库Prism,他可以把事件当命令传递,且能传递事件的默认参数,详情请参阅这篇文章;好了,下面开始介绍,扩展DataGrid类,通过自定义命令抛出事件,并传递事件参数...
先请大致看下运行效果:
下面是详情代码,尾部有完整demo,下载
1 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
2 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
3 xmlns:local="clr-namespace:CustomCommand">
4
5 <Style TargetType="DataGrid">
6 <Setter Property="IsReadOnly" Value="True" />
7 <Setter Property="CanUserAddRows" Value="False" />
8 <Setter Property="CanUserDeleteRows" Value="False" />
9 <Setter Property="VirtualizingPanel.ScrollUnit" Value="Pixel" />
10 </Style>
11
12 <!--为了不影响已设置的最基础样式,所以下面这个集成样式很重要-->
13 <Style TargetType="local:CustomDataGrid" BasedOn="{StaticResource {x:Type DataGrid}}" />
14
15 <DataTemplate x:Key="RowDetails">
16 <local:CustomDataGrid ItemsSource="{Binding Infos}"
17 MouseWheelCommand="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window},Path=MouseWheelCommand}" />
18 </DataTemplate>
19 </ResourceDictionary>
特别标注下,需要继承默认样式,否则应用到项目中,会区别出异样的
<!--为了不影响已设置的最基础样式,所以下面这个集成样式很重要-->
<Style TargetType="local:CustomDataGrid" BasedOn="{StaticResource {x:Type DataGrid}}" />
1 using Prism.Commands;
2 using System;
3 using System.Collections.Generic;
4 using System.Collections.ObjectModel;
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 CustomCommand
19 {
20 /// <summary>
21 /// MainWindow.xaml 的交互逻辑
22 /// </summary>
23 public partial class MainWindow : Window
24 {
25 /// <summary>
26 /// 鼠标滚动时发送
27 /// </summary>
28 public ICommand MouseWheelCommand { get; private set; }
29
30 public ObservableCollection<Info> Datas = new ObservableCollection<Info>();
31
32 public MainWindow()
33 {
34 MouseWheelCommand = new DelegateCommand<object>(CustomMouseWheel);
35
36 InitializeComponent();
37 datagrid.ItemsSource = Datas;
38
39 for (int i = 0; i < 50; i++)
40 {
41 var info = new Info();
42 info.name = "第一级" + i;
43 Datas.Add(info);
44
45 if (i % 2 == 0)
46 {
47 for (int j = 0; j < 20; j++)
48 {
49 info.Infos.Add(new Info()
50 {
51 name = "第二级" + j
52 });
53 }
54 }
55 }
56 }
57
58
59 /// <summary>
60 /// 当DataGrid的详情行里的DataGrid滚动时发生
61 /// </summary>
62 /// <param name="obj"></param>
63 void CustomMouseWheel(object p)
64 {
65 if (p is MouseWheelEventArgs e)
66 {
67 var sc = GetVisualChild<ScrollViewer>(datagrid);
68 if (sc != null)
69 {
70 sc.ScrollToVerticalOffset(sc.VerticalOffset - e.Delta);
71 }
72 }
73 }
74
75 T GetVisualChild<T>(Visual parent) where T : Visual
76 {
77 T child = default(T);
78 int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
79 for (int i = 0; i < numVisuals; i++)
80 {
81 var v = (Visual)VisualTreeHelper.GetChild(parent, i);
82 child = v as T ?? GetVisualChild<T>(v);
83 if (child != null)
84 break;
85 }
86 return child;
87 }
88 }
89
90 public class Info
91 {
92 public string name { get; set; }
93
94 public ObservableCollection<Info> Infos { get; set; } = new ObservableCollection<Info>();
95 }
96 }
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6 using System.Windows;
7 using System.Windows.Controls;
8 using System.Windows.Input;
9
10 namespace CustomCommand
11 {
12 /// <summary>
13 /// 自定义扩展DataGrid 主要是用于响应滚轮事件
14 /// </summary>
15 public class CustomDataGrid : DataGrid
16 {
17 public CustomDataGrid()
18 {
19 PreviewMouseWheel += CustomDataGrid_PreviewMouseWheel;
20 }
21
22 /// <summary>
23 /// 鼠标滚动滚动时
24 /// </summary>
25 /// <param name="sender"></param>
26 /// <param name="e"></param>
27 private void CustomDataGrid_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
28 {
29 MouseWheelCommand?.Execute(e);//触发命令,并把MouseWheelEventArgs传递
30 }
31
32 /// <summary>
33 /// 声明一个用于滚动通知的命令
34 /// </summary>
35 public ICommand MouseWheelCommand
36 {
37 get { return (ICommand)GetValue(MouseWheelCommandProperty); }
38 set { SetValue(MouseWheelCommandProperty, value); }
39 }
40
41 public static readonly DependencyProperty MouseWheelCommandProperty =
42 DependencyProperty.Register("MouseWheelCommand", typeof(ICommand), typeof(CustomDataGrid), new PropertyMetadata(default(ICommand)));
43
44 }
45 }
下面是完整demo,有需要的可以下载
还有的时候,会遇到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 ...
- extJS4.2.0 Json数据解析,嵌套及非嵌套(二)
Ext.data.reader.Reader Readers通常用于翻译数据,使其被加载为 Model 实例或Store, 该数据一般是一个AJAX请求的响应数据. 一般情况下不需要直接创建一个Rea ...
- angularJs模块ui-router之状态嵌套和视图嵌套
原文地址:http://bubkoo.com/2014/01/01/angular/ui-router/guide/nested-states%20&%20nested-views/ 状态嵌套 ...
随机推荐
- WAIC 2024盛大召开,天翼云以全栈智算能力赋能AI时代!
7月5日,2024世界人工智能大会期间,中国电信星辰人工智能生态论坛在上海世博中心启幕.论坛以"星辰注智,焕新领航"为主题,围绕人工智能技术发展趋势,分享中国电信与产业各界在人工智 ...
- ChatGPT 背后的英雄——AI芯片
本文分享自天翼云开发者社区<ChatGPT 背后的英雄--AI芯片>,作者:w****n AI芯片能为人工智能应用提供所需的基础算力:按技术架构主要分为GPU.FPGA和ASIC.Chat ...
- Flink监控看板Dashboard解析
一. 二.常见问题排查 1.数据反压 背压(Backpressure)机制排查 点击JobName 点击某个算子 点击Backpressure查看,状态为HIGH时,则存在数据反压问题 注:若流程为A ...
- AI-启动
前言 我们都知道AI可以帮助我们完成很多工作,同时也可以帮助我们快速生成一些繁琐的文档:本篇介绍接入一些开源的大预言模型: 准备 OpenAPI 首先需要了解下什么是OpenAPI,OpenAPI是一 ...
- Lombok 只会用@Setter @Getter @Data ? 老鸟带你玩转lombok
lombok的官网 官方网址 : https://projectlombok.org lombok 稳定特性文档:https://projectlombok.org/features/ lombok ...
- Deepseek学习随笔(5)--- DeepSeek 在职场中的应用
自动化办公 在职场中,DeepSeek 可以帮助自动化办公流程,如生成日报.撰写邮件等: 日报生成:请根据今日工作内容生成一份日报 DeepSeek 会生成一份简洁的工作日报,帮助你总结当天的工作内容 ...
- Flume - [03] HDFS Sink
一.概述 将事件写入 Hadoop 分布式文件系统(HDFS).目前支持创建文本和序列文件.支持两种文件类型的压缩.可以根据经过的时间.数据大小或事件数 周期性地滚动文件(关闭当前文件并创建文件) ...
- Zookeeper - Zookeeper启动失败,日志报错 Missing election port for server: 2
Missing election port for server: 2 [整理日期]2023年6月1日 [基础环境]JDK 1.8.0_372.Zookeeper 3.4.5 [问题描述]进行部署分布 ...
- 2024.11.19随笔&联考总结
联考 看到 T1 就知道一定是简单计数题然后发现 \(O(n)\) 可以过于是就大概写了写式子就开写.写的过程中犯了一些低级错误,代码重构了一次才过.耽误的时间比较久.然后开 T2,一眼有一个 \(O ...
- form-create-designer中怎么扩展自定义组件
form-create-designer中怎么扩展自定义组件 form-create-designer 是基于 @form-create/element-ui实现的表单设计器组件.可以通过拖拽的方式快 ...