WPF布局控件

目录

Grid

StackPanel

WrapPanel

DockPanel

UniformGrid

Canvas&InkCanvas

Canvas

InkCanvas

Border


Grid

属性

ShowGridLines:显示边线

ColumnDefinitions 列集合 表示有几列下面就写几个ColumnDefinition

Width 宽:如果写具体数字则表示具体的宽度

没有写具体的值的话 剩余宽度平均分配 会根据屏幕的大小自动分配

* 代表比例

auto 代表自动填充最大宽度

RowDefinitions 行集合 表示有几行下面就写几个RowDefinition

Height 高:如果写具体数字则表示具体的高度

没有写具体的值的话 剩余高度平均分配 会根据屏幕的大小自动分配

* 代表比列

auto 代表自动填充最大宽度

Grid.IsSharedSizeScope="True" 共享列宽

需要在最外层Grid打开这个设置,然后在下面需要共享列宽的列设置:SharedSizeGroup="A"

Group一样的共享。

在Grid中,其他的控件想要放几行几列 需要另外设置:

Grid.Column = "几列" Grid.Row="几行" 没有设置默认 0列 0行

合并单元格

Grid.ColumnSpan = "合并几行" Grid.RowSpan="合并几列"

这里不是指定哪一列,而是指定合并多少列

Grid使用技巧:

  1. Grid中可以嵌套Grid。
  2. 当Windwo下面只能有一个控件的时候Grid是最好的控件。
  3. 任何布局只要使用恰当,都可以用Grid布局出来。
<Grid Grid.IsSharedSizeScope="True"><Grid ShowGridLines="True" Visibility="Hidden"><Grid.ColumnDefinitions><ColumnDefinition Width="100"/><ColumnDefinition Width="auto"/><ColumnDefinition /><ColumnDefinition /></Grid.ColumnDefinitions><Grid.RowDefinitions><RowDefinition Height="100"/><RowDefinition /><RowDefinition /><RowDefinition /><RowDefinition /></Grid.RowDefinitions><Grid ShowGridLines="True" Grid.Row="2" Grid.Column="1" /><Button Grid.Column="2" Grid.Row="2" Grid.ColumnSpan="2"  Grid.RowSpan="2"/></Grid><Grid Height="30" ShowGridLines="True" VerticalAlignment="Top"><Grid.ColumnDefinitions><ColumnDefinition SharedSizeGroup="A" Width="100"/><ColumnDefinition /><ColumnDefinition /><ColumnDefinition /></Grid.ColumnDefinitions><GridSplitter HorizontalAlignment="Right" Width="5" Background="Red"/></Grid><Grid Height="200" ShowGridLines="True" VerticalAlignment="Bottom"><Grid.ColumnDefinitions><ColumnDefinition SharedSizeGroup="A"/><ColumnDefinition /><ColumnDefinition /><ColumnDefinition /></Grid.ColumnDefinitions></Grid>
</Grid>

StackPanel

默认 从下往往压榨的模式

属性

Orientation 改变压榨方向 如果内容有固定大小,就大小撑开,如果没有固定大小,就根据内容撑开

FlowDirection 读写习惯 左向右 或右向左

使用场景:图文并显、工具栏

可以用Grid代替

<StackPanel Orientation="Horizontal" FlowDirection="RightToLeft"><Button Content="Button1" /><Button Content="Button2" /><Button Content="Button3" />
</StackPanel>

WrapPanel

唯一一个不可以被Grid替代的布局控件,水平方向排列,过程中当前子项出界了,进行换行

属性

Orientation 调整排列方向 默认值为水平方向

如果是水平排列 最大高度为所在行的最大高度为定

如果是垂直排列 最大宽度为所在行的最大宽度为定

使用场景:电脑桌面式图标排列、浏览器搜索历史关键词排列信息

<WrapPanel Orientation="Horizontal"><Button Content="Button1" Width="100" Height="30" /><Button Content="Button1" Width="100" Height="30" /><Button Content="Button1" Width="100" Height="30" Margin="10" /><Button Content="Button1" Width="100" Height="30" /><Button Content="Button1" Width="100" Height="30" /><Button Content="Button1" Width="100" Height="40" /><Button Content="Button1" Width="100" Height="30" /><Button Content="Button1" Width="200" Height="30" />
</WrapPanel>

DockPanel

停靠控件

属性

LastChildFill 最后一个孩子 是否填充

DockPanel.Dock 附加给子项控件使用 设置Dock属性 上下左右 停靠在哪里

注意:先写显示哪个子项的,先占有位置,第二个只能在空余位置中设置

使用场景:应用的主窗口布局(标题栏 状态栏 工具栏 菜单栏)

<DockPanel LastChildFill="False"><Button Content="Button1" Width="100" DockPanel.Dock="Bottom"/><Button Content="Button3" DockPanel.Dock="Top"/><Button Content="Button2" DockPanel.Dock="Left"/><Button Content="Button4" Width="200" />
</DockPanel>

UniformGrid

均分 1*1 2*2 3*3 均分 等比分

属性

Columns 一共最多多少列 不存在指定列宽

Rows 一共最多多少行 不存在指定列高

如果只设置列 则内容行均分

如果只设置行 则内容列均分

如果行列都设置 则内容超出界面显示区域 但是也绘制

使用场景:9宫格的功能区域、图表(柱状图)

<UniformGrid Columns="3" Rows="3" Visibility="Collapsed"><Button Content="Button1"/><Button Content="Button2"/><Button Content="Button3"/><Button Content="Button4"/><Button Content="Button5"/><Button Content="Button6"/><Button Content="Button7"/><Button Content="Button8"/><Button Content="Button9"/>
</UniformGrid>

<UniformGrid Rows="1"><StackPanel Orientation="Vertical" VerticalAlignment="Bottom"><Border Height="150" Width="10" Background="Gray" VerticalAlignment="Bottom"/><Border Height="100" Width="10" Background="Orange" VerticalAlignment="Bottom"/></StackPanel><Border Height="150" Width="10" Background="Orange" VerticalAlignment="Bottom"/><Border Height="120" Width="10" Background="Orange" VerticalAlignment="Bottom"/><Border Height="100" Width="10" Background="Orange" VerticalAlignment="Bottom"/><Border Height="100" Width="10" Background="Orange" VerticalAlignment="Bottom"/><Border Height="200" Width="10" Background="Orange" VerticalAlignment="Bottom"/><Border Height="100" Width="10" Background="Orange" VerticalAlignment="Bottom"/><Border Height="100" Width="10" Background="Orange" VerticalAlignment="Bottom"/>
</UniformGrid>

Canvas&InkCanvas

Canvas

默认子控件坐标对齐左上角

属性

Canvas.Left 左边多少距离

Canvas.Top 上方多少距离

Canvas.Right 右边多少距离

Canvas.Bottom 下方多少距离

可以用Margin代替

如果上下左右都设置 优先级 左>右 上>下

使用场景:组态、组件分装(仪表指针)

<Canvas><Button Content="Button1" Canvas.Left="100" Canvas.Top="20"/><Button Content="Button2" Canvas.Right="120" Canvas.Bottom="20"/><Button Content="Button2" Margin="10"/>
</Canvas>

InkCanvas

笔迹 -- 可以当画板 获取笔迹

属性

EditingMode 编辑的模式

Ink 笔迹 画布 默认Ink

EraseByPoint 根据点删除

EraseByStroke 整条线删除

Select 选中 可以编辑

DefaultDrawingAttributes 设置线的颜色和宽度和高度

使用场景:画板、签字、电子黑板

<InkCanvas EditingMode="Ink" Name="inkCanvas"><InkCanvas.DefaultDrawingAttributes><DrawingAttributes Color="Red" Width="2" Height="2"/></InkCanvas.DefaultDrawingAttributes><Button Content="Button1" InkCanvas.Left="100" InkCanvas.Top="20" Click="Button_Click"/><Button Content="Button2" InkCanvas.Right="120" InkCanvas.Bottom="20" Click="Button_Click_1"/><Button Content="Button3" InkCanvas.Right="150" InkCanvas.Bottom="200" Click="Button_Click_2"/>
</InkCanvas>

Ink模式:

Select模式:

保存笔迹的做法:

private void Button_Click_4(object sender, RoutedEventArgs e)
{// 笔迹保存using FileStream fileStream = new FileStream("test.sk",FileMode.OpenOrCreate,FileAccess.ReadWrite);this.inkCanvas.Strokes.Save(fileStream,true);
}
private void Button_Click_5(object sender, RoutedEventArgs e)
{// 清除this.inkCanvas.Strokes.Clear();
}
private void Button_Click_6(object sender, RoutedEventArgs e)
{// 加载using FileStream fileStream = new FileStream("test.sk", FileMode.Open, FileAccess.Read);this.inkCanvas.Strokes.Add(new System.Windows.Ink.StrokeCollection(fileStream));
}

手写识别案例:

Ink ink = new Ink();
private void Button_Click(object sender, RoutedEventArgs e)
{// 识别库using RecognizerContext recognizerContext = new RecognizerContext();recognizerContext.Strokes = ink.CreateStrokes();recognizerContext.Strokes.Add(CombineStrokr());RecognitionResult result = recognizerContext.Recognize(out RecognitionStatus status);RecognitionAlternates als = result.GetAlternatesFromSelection();List<string> strs = new List<string>();for (int i = 0; i < als.Count; i++){strs.Add(als[i].ToString());}
}// Strokr 合并
private Stroke CombineStrokr()
{List<System.Drawing.Point> points = new List<System.Drawing.Point>();foreach (var item in this.inkCanvas.Strokes){// 将 StylusPoints 转换为 System.Drawing.Point points.AddRange(item.StylusPoints.Select(p => new System.Drawing.Point((int)p.X, (int)p.Y)).ToList());}return ink.CreateStroke(points.ToArray());
}
<!--手写文字识别Demo-->
<InkCanvas Name="inkCanvas" /><Button Content="识别" Click="Button_Click" VerticalAlignment="Bottom"/>

需要引用以下dll库: 可以在本合集置顶博客看我的代码路径,可以下载使用即可。

演示如下:

手写个A:

识别出来的为:

看代码反馈,也很难不看出,是NoError,证明识别成功。然后再strs中进行解析匹配像的值。

可以看出,识别效果还是很准确的,第一个就是想要的值。
微软官网也有Ink识别笔画和形状的案例:https://learn.microsoft.com/zh-cn/windows/apps/design/input/convert-ink-to-text

Border

装饰控件

Border内部只能放一个对象

使用场景:

需要背景的时候,或者需要特殊样式的时候

<Border CornerRadius="20" Width="200" Height="80"Background="Orange" BorderBrush="Red" BorderThickness="2"><Border.Clip><RectangleGeometry RadiusX="20" RadiusY="20" Rect="2 2 196 76" /></Border.Clip><Grid Background="Gray" />
</Border>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/39105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

科普文:一文搞懂jvm实战(一)Runtime实时监控jvm

概叙 Java Runtime 类是 Java 标准库中的关键类之一。它提供了对当前Java虚拟机&#xff08;JVM&#xff09;实例的访问和控制&#xff0c;允许程序动态地修改和管理运行时环境。 Java Runtime 是Java虚拟机&#xff08;JVM&#xff09;的一个实例&#xff0c;代表了正在执行Ja…

Spring Boot 实现 AOP 动态热插拔功能并附DEMO源码

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

python中的包和模块

目录 一、包与模块 二、第三方包的安装 2.1 pip install 2.2使用 curl 管道 2.3其他安装方法 三、导入单元的构成 3.1pip的使用 四、模块的缓存 一、包与模块 Python 中除了函数库以外&#xff0c;还有非常多且优秀的第三方库、包、模块。 模块Module&#xff1a;以…

【linux网络(七)】数据链路层详解

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux网络 1. 前言2. 认识MAC…

【计算机毕业设计】061互助学习微信小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

北京网站建设怎么开始做

北京作为中国的首都&#xff0c;拥有众多的企业和机构&#xff0c;网站建设不仅是一种宣传和推广的手段&#xff0c;更是企业发展的必备工具。但是对于很多企业来说&#xff0c;网站建设是一个相对陌生的领域&#xff0c;不知道从哪里开始。今天我们就来谈一谈北京网站建设的步…

Dockerhub无法拉取镜像配置阿里镜像加速器

打开阿里镜像加速地址&#xff1a; https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 根据平台类型按照对应方式进行配置&#xff1a;Dokcer Desktop是在右上角点开配置 找到Docker Engine 进行设置JSON结构&#xff1a; 记得要重启Docker服务才会生效&#xff01…

深度学习笔记: 最详尽解释预测系统的分类指标(精确率、召回率和 F1 值)

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家&#xff01; 预测系统的分类指标(精确率、召回率和 F1 值) 简介 让我们来谈谈预测系统的分类指标以及对精确率、召回…

SpringSecurity6 | 基于数据库实现登录认证

SpringSecurity6 | 基于数据库认证 ✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 循序渐进学SpringSecurity6 ✨特色专栏: MySQL学习 🥭本文内容: SpringSecurity6 | 基于数据库实现登…

数据资产的价值变现及管理规划(AMT企源)

从数据资源到数据资产之数据资产的价值变现及管理规划 题记 本文旨在探讨数据资产发展途径、数据产权及价值变现的服务流程和路径&#xff0c;并对数据资产管理平台框架、数据资产管理实施规划做出初步解读&#xff0c;以期为数据资产管理提供有益的思路和方案。 本次推出《从…

09 - Python图形用户界面和游戏开发

图形用户界面和游戏开发 基于tkinter模块的GUI GUI是图形用户界面的缩写&#xff0c;图形化的用户界面对使用过计算机的人来说应该都不陌生&#xff0c;在此也无需进行赘述。Python默认的GUI开发模块是tkinter&#xff08;在Python 3以前的版本中名为Tkinter&#xff09;&…

【linux】虚拟机安装 BCLinux-R8-U4-Server-x86_64

目录 一、概述 1.1移动云Linux系统订阅服务 CLS 1.2 大云天元操作系统BC-Linux 二、安装 一、概述 1.1移动云Linux系统订阅服务 CLS 移动云Linux系统订阅服务 CLS &#xff08;Cloud Linux Service&#xff09;为使用BC-Linux操作系统的用户提供标准维保服务以及高级技术支…

mysql-5.6.26-winx64免安装版本

mysql为什么要使用免安装 MySQL 提供免安装版本主要有以下几个原因和优势&#xff1a; 便捷性&#xff1a;用户无需经历安装过程&#xff0c;直接解压即可使用。这对于需要快速部署环境或者在不支持安装权限的系统上使用MySQL非常有用。灵活性&#xff1a;免安装版允许用户将…

Optional类方法

Optional类 简介方法empty()方法of(T value)ofNullable(T value)filter(Predicate<? super T> predicate)get()ifPresent(Consumer<? super T> consumer)isPresent()map(Function<? super T,? extends U> mapper)orElse(T other)orElseGet(Supplier<?…

LeetCode 子集

原题链接78. 子集 - 力扣&#xff08;LeetCode&#xff09; 这是一道暴力搜索问题参考大佬们的题解&#xff0c;对这类题目做出一下总结 1.确定递归参数变量 2.递归结束条件 3.做出选择&#xff0c;递归调用进入下一层 4.回溯&#xff0c;返回到递归前的状态 要完成前面这…

最新扣子(Coze)实战案例:图像流工具之创建一个精美的LOGO,完全免费教程

&#x1f9d9;‍♂️ 大家好&#xff0c;我是斜杠君&#xff0c;手把手教你搭建扣子AI应用。 &#x1f4dc; 本教程是《AI应用开发系列教程之扣子(Coze)实战教程》&#xff0c;完全免费学习。 &#x1f440; 关注斜杠君&#xff0c;可获取完整版教程。&#x1f44d;&#x1f3f…

商家团购app微信小程序模板

手机微信商家团购小程序页面&#xff0c;商家订餐外卖小程序前端模板下载。包含&#xff1a;团购主页、购物车订餐页面、我的订单、个人主页等。 商家团购app微信小程序模板

linux-内存映射MMAP-lseek-dup-fifo-通信-IO多路复用

1、内存映射MMap&#xff1a; DMA&#xff1a; 可以用*/[]取代read和write&#xff1b; 限制&#xff1a; 1、文件大小固定不能改变&#xff1b;&#xff08;ftruncate&#xff09; 2、只能是磁盘文件&#xff1b; 3、建立映射之前先open mmap函数&#xff1a; mmap第一个…

生产环境 CentOS 7 k8s v1.28.0离线部署

背景描述&#xff1a;CentOS 7 Kubernetes 离线部署 随着云计算和微服务架构的普及&#xff0c;Kubernetes&#xff08;K8s&#xff09;已经成为容器编排的标准工具。它能够自动化应用的部署、扩展和管理&#xff0c;使得开发和运维的工作更加高效和可靠。然而&#xff0c;在一…

腾讯开源高质量人类运动视频的框架;通过音频指令修改图像;利用YOLO分析网球视频;Gemma-2中文微调模型

✨ 1: MimicMotion MimicMotion 腾讯开源的通过姿态指导生成高质量任意长度人类运动视频的框架 MimicMotion 是一种可控视频生成框架&#xff0c;旨在生成高质量的任意长度人物动作视频&#xff0c;采用带有置信度的姿态引导&#xff0c;并通过区域损失放大来缓解图像失真。其…