首页 > 其他分享 >DataGrid的自动行列显示

DataGrid的自动行列显示

时间:2024-12-30 20:29:58浏览次数:5  
标签:控件 grid Auto DataGrid 行列 自动 new var Grid

新建wpf页面DataGridAutoView

引用空间: xmlns:ga="clr-namespace:WPFDemoMVVM.Helpers"

		<Window x:Class="WPFDemoMVVM.View.DataGridAutoView"
				xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
				xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
				xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
				xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
				xmlns:local="clr-namespace:WPFDemoMVVM.View"
				xmlns:ga="clr-namespace:WPFDemoMVVM.Helpers"
				mc:Ignorable="d"
				Title="DataGridAutoView" Height="450" Width="800">
			<Grid>

				<Grid ga:GridAssist.AutoRowColumn="_,2">
					<Grid.Resources>
						<Style TargetType="Label" BasedOn="{StaticResource {x:Type Label}}">
							<Setter Property="VerticalContentAlignment" Value="Center"></Setter>
							<Setter Property="Width" Value="120"></Setter>
							<Setter Property="Height" Value="40"></Setter>
						</Style>
						<Style TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}">
							<Setter Property="VerticalAlignment" Value="Center"></Setter>
							<Setter Property="Width" Value="180"></Setter>
						</Style>
					</Grid.Resources>


					<Label Content="IP Address"></Label>
					<TextBox Text="127.0.0.1"></TextBox>

					<Label Content="Port"></Label>
					<TextBox Text="8080"></TextBox>

					<Label Content="TimeOut"></Label>
					<TextBox Text="10000"></TextBox>

				</Grid>


			</Grid>
		</Window>

新建一个类GridAssist

在命名空间clr-namespace:WPFDemoMVVM.Helpers下,新建GridAssist类

		static class GridAssist
		{
			#region AutoRowColumn

			public static string GetAutoRowColumn(DependencyObject obj)
			{
				return (string)obj.GetValue(AutoRowColumnProperty);
			}

			public static void SetAutoRowColumn(DependencyObject obj, string value)
			{
				obj.SetValue(AutoRowColumnProperty, value);
			}

			/// <summary>
			/// 自动排列 Grid 容器中的所有控件
			/// </summary>
			/// <remarks>
			/// 值为一个逗号隔开的字符串,形如:<br/>
			/// - 2,3(2 行 3 列,列宽默认为 1*,行高为 Auto)<br/>
			/// - _,3(3 列,行数根据子控件而定)<br/>
			/// - 2,3,Auto(列的宽度为 Auto)<br/>
			/// Grid 中的所有控件将自动按照从左到右、从上到下的顺序进行排列<br/>
			/// 控件各自的 RowSpan 以及 ColumnSpan 也会被考虑
			/// </remarks>
			/// <example>
			/// <code>
			/// <![CDATA[
			/// <Window xmlns:ap="clr-namespace:NemoDemo.AttachedProperties">
			///     <Grid ap:GridHelper.AutoRowColumn="2,3">
			///         <Button />                     // 1,1
			///         <Label />                      // 1,2
			///         <TextBox />                    // 1,3
			///         <Button />                     // 2,1
			///         <Label Grid.ColumnSpan="2" />  // 2,2-3
			///     </Grid>
			/// </Window>
			/// ]]>
			/// </code>
			/// </example>
			public static readonly DependencyProperty AutoRowColumnProperty = DependencyProperty.RegisterAttached(
				"AutoRowColumn",
				typeof(string),
				typeof(GridAssist),
				new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.AffectsMeasure, OnAutoRowColumnChanged)
			);

			private static void OnAutoRowColumnChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
			{
				if (!(d is Grid grid))
					return;

				var value = e.NewValue as string;
				if (string.IsNullOrEmpty(value))
				{
					grid.RowDefinitions.Clear();
					grid.ColumnDefinitions.Clear();

					grid.Loaded -= OnGridLoaded;
					return;
				}

				grid.Loaded += OnGridLoaded;

				if (grid.IsLoaded)
					OnGridLoaded(grid, null);
			}

			private static void OnGridLoaded(object sender, RoutedEventArgs e)
			{
				var grid = sender as Grid;

				// 列宽,默认为 Star,即平均分布
				var width = new GridLength(1.0, GridUnitType.Star);
				var split = GridAssist.GetAutoRowColumn(grid).Split(',');
				var r = split[0] != "_" ? int.Parse(split[0]) : 1;
				var c = int.Parse(split[1]);
				// 如果有第三个参数且值为 auto,则宽度为 Auto
				if (split.Length == 3 && split[2].Equals("auto", StringComparison.OrdinalIgnoreCase))
					width = GridLength.Auto;
				grid.RowDefinitions.Clear();
				grid.ColumnDefinitions.Clear();
				for (int i = 0; i < r; i++)
					grid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });
				for (int i = 0; i < c; i++)
					grid.ColumnDefinitions.Add(new ColumnDefinition { Width = width });

				var cols = grid.ColumnDefinitions.Count;

				var map = new List<bool[]>();

				int x = 0,
					y = 0;
				foreach (UIElement item in grid.Children)
				{
					var rowSpan = Grid.GetRowSpan(item);
					var colSpan = Grid.GetColumnSpan(item);

					// 默认从上到下,从左到右,即任何时候控件的下方和右方都是空的
					// 可能会出现中途有一个 RowSpan > 1 导致其左下方的右侧不为空的情况,暂不处理
					// 同时默认当前的 (x, y) 位置是一个可用位置

					// 当前控件占据的格子
					for (int i = 0; i < rowSpan; i++)
					{
						// 如果 RowDefinition 不够用,则自动添加
						if (map.Count <= y + i)
						{
							while (map.Count <= y + i)
							{
								grid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });
								map.Add(new bool[cols]);
							}
						}

						map[y + i][x] = true;
					}

					for (int i = 0; i < colSpan; i++)
					{
						if (x + i >= cols)
							break;
						map[y][x + i] = true;
					}

					Grid.SetRow(item, y);
					Grid.SetColumn(item, x);

					// 寻找下一个可用的格子
					while (map[y][x])
					{
						x++;
						if (x >= cols)
						{
							x = 0;
							y++;
							if (y >= map.Count)
							{
								grid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });
								map.Add(new bool[cols]);
							}
						}
					}
				}
			}

			#endregion
		}

wpf项目:https://gitee.com/chenshibao/wpfdemo

标签:控件,grid,Auto,DataGrid,行列,自动,new,var,Grid
From: https://www.cnblogs.com/chenshibao/p/18642334

相关文章

  • 自动化测试工具Ranorex Studio(七十五)-录制ANDROID测试
    录制您的ANDROID测试准备好设备,并调制好APK后,,选择对应的设备以及要执行的App,就可以开始录制了。 图:选择设备和移动App进行录制按“开始”按钮后,调制在移动设备上的App将自动运行,并在桌面上弹出通知,告之用户移动设备上的操作将被录制。 图:录制通知在录制过程中,Ranorex......
  • 水位自动监测预警摄像机
    水位自动监测预警摄像机是一种智能监测设备,可以用于监测水位变化并及时预警。在各类水库、河流、水闸和排水系统等场所普遍应用,这种设备通过智能技术监测水位,一旦发现水位异常变化便立即发出预警信号,提醒相关部门及时采取措施,从而最大限度地减少水灾风险。水位自动监测预警摄像......
  • el-input使用autocomplete保留输入记录,实现自动补全|el-form调用原生submit
    框架:vue、element-plus语言:ts前言项目中有个输入框需要保存历史记录,以便于人员操作。然而网上大部分都是去掉历史记录的方法,实际上element-plus中,autocomplete属性默认就是off,根本不用手动关闭。框架代码实现实现要点如下:在<el-form>标签上添加@submit.preventel-......
  • 基于人工智能驱动的无代码自动化测试平台:testRigor!
    1、testRigor介绍简单来说,testRigor是一款基于人工智能驱动的无代码自动化测试平台,它能够通过分析应用的行为模式,智能地生成测试用例,并自动执行这些测试,无需人工编写测试脚本。可以用于Web、移动、API和本机桌面应用程序的测试。允许用户从最终用户的角度创建端到端测试,从而消除......
  • 推荐一款Python开源自动化脚本工具:AutoKey
    1、前言在数字化时代,自动化工具成为了提升工作效率和生产力的重要手段。Python作为一种广泛使用的编程语言,以其强大的功能和易用性受到许多开发者的青睐。而今天给大家推荐一款开源的自动化脚本工具:AutoKey。结合Python的强大编程能力与AutoKey的任务自动化特性,用户可以高效地......
  • Java难绷知识03——包装器类及其自动装箱和拆箱
    Java难绷知识03——包装器类及其自动装箱和拆箱本篇文章和之前的倾向稍微有些不同,这篇文章我不仅要讨论一些容易头疼的细节,而且我打算尝试讨论一下如何理解Java中的包装类以及自动拆箱和自动装箱自动装箱(Autoboxing)和自动拆箱(Unboxing)是在基本数据类型和它们对应的包装类之间“......
  • 线性代数3.矩阵的行列式
    3.矩阵的行列式3.1二阶行列式定义:\[形如\begin{vmatrix}a&b\\c&d\end{vmatrix}的式子为二阶行列式,其中\begin{vmatrix}a&b\\c&d\end{vmatrix}=ad-bc\]应用:设存在以下二元线性方程组:\[\begin{cases}a_{11}x_1+a_{12}x_2=b_1\\a_{21}x_1+a_{22}x_2=b_2......
  • 自动化漏洞挖掘
    自动化漏洞挖掘1.Goby&xray安装xray集成了非常多的漏洞验证脚本,可以帮忙做sql注入xss检测goby梳理攻击面,扫描IP或域名漏洞xray使用:xray包含了主动攻击和被动监听主动扫描:扫描目标发现漏洞(可能存在漏洞误报的现象,使用要进行手动验证)xray.exewebscan--basic-crawlerht......
  • Open Notebook:开源 AI 笔记工具,支持多种文件格式,自动转播客和生成总结,集成搜索引擎等
    ❤️如果你也关注AI的发展现状,且对AI应用开发非常感兴趣,我会每日跟你分享最新的AI资讯和开源应用,也会不定期分享自己的想法和开源实例,欢迎关注我哦!......
  • video-analyzer:开源视频分析工具,支持提取视频关键帧、音频转录,自动生成视频详细描述
    ❤️如果你也关注AI的发展现状,且对AI应用开发非常感兴趣,我会每日跟你分享最新的AI资讯和开源应用,也会不定期分享自己的想法和开源实例,欢迎关注我哦!......