2019-10-31-WPF-等距布局
| title | author | date | CreateTime | categories |
|---|---|---|---|---|
|
WPF 等距布局
|
lindexi
|
2019-10-31 9:0:2 +0800
|
2018-2-21 17:3:4 +0800
|
WPF 布局
|
本文告诉大家如何使用 WPF 的自定义布局做等距布局。
实际做的效果很简单,因为在开发我容易就用到了等距的控件。等距控件就是在指定的宽度下,平均把控件放在水平的地方,这样相等于 StackPanel 的水平,但是没有做水平压缩。在这个控件,无论在水平放多少个控件,都会在相同的高度把他们放下。如果里面的控件的宽度不相同,那么这些控件拿到的可以使用的宽度都是相同。
请看下面的图片
上面图片是存在 6 个按钮的,所有的按钮使用的宽度都是一样
现在修改为 3 个按钮,可以看到说有按钮都是相同
现在加两个宽度很小的文本,可以看到文本可以的宽度和按钮一样
下面让我告诉大家这个控件是如何做。
在 WPF 做自己的面板可以继承Panel ,可以重写两个方法,第一个方法是 MeasureOverride ,重写这个方法可以告诉上一级控件,这个控件需要多大的空间。第二个方法是 ArrangeOverride 告诉元素可以怎么放。
下面创建一个类 KbiseczvTom 这是等距控件。
首先重写MeasureOverride,因为需要的一般只是做水平等距,所以就需要拿到元素的宽度和高度,把所有的宽度合起来作为这个控件需要的最小宽度,然后拿到所有控件的最大高度作为这个控件的需要高度。虽然从 MeasureOverride 返回了大小,但是实际上的上一级控件是不是最后给这么大的,还是不知道的。
protected override Size MeasureOverride(Size availableSize)
{
var size = new Size();
foreach (var temp in Children.Cast<UIElement>())
{
temp.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
size = new Size(size.Width + temp.DesiredSize.Width, Math.Max(size.Height, temp.DesiredSize.Height));
}
return size;
}
在调用 Measure 传入无穷是因为这是需要让元素告诉控件需要的最大大小。
然后就是重写 ArrangeOverride ,传入的参数就是上一级控件给这个控件的大小,返回值就是实际需要的大小。现在可以使用元素的 Arrange 通过这个可以把元素给元素的大小,左上角。但是元素是不是就听话,实际上还是不知道的。首先拿到元素数,把拿到的宽度除元素得到一个元素可以使用宽度,然后把每个元素按照顺序给左上角,宽度。
protected override Size ArrangeOverride(Size availableSize)
{
var size = availableSize;
var width = size.Width / Children.Count;
for (int i = 0; i < Children.Count; i++)
{
var temp = Children[i];
temp.Arrange(new Rect(new Point(i*width,0),new Size(width,size.Height)));
}
return size;
}
现在打开界面写下面代码试试
<local:KbiseczvTom HorizontalAlignment="Stretch" Height="100">
<Button Margin="10,10,10,10" Content="点击"></Button>
<Button Margin="10,10,10,10" Content="点击"></Button>
<Button Margin="10,10,10,10" Content="点击"></Button>
<TextBlock VerticalAlignment="Center" Text="文本"></TextBlock>
<TextBlock VerticalAlignment="Center" Text="文本"></TextBlock>
</local:KbiseczvTom>
所有代码:
public class KbiseczvTom : Panel
{
protected override Size MeasureOverride(Size availableSize)
{
var size = new Size();
foreach (var temp in Children.Cast<UIElement>())
{
temp.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
size = new Size(size.Width + temp.DesiredSize.Width, Math.Max(size.Height, temp.DesiredSize.Height));
}
return size;
}
protected override Size ArrangeOverride(Size availableSize)
{
var size = availableSize;
var width = size.Width / Children.Count;
for (int i = 0; i < Children.Count; i++)
{
var temp = Children[i];
temp.Arrange(new Rect(new Point(i*width,0),new Size(width,size.Height)));
}
return size;
}
}
源代码:WPF 等距布局-CSDN下载
因为现在的 csdn 是需要下载积分,所以我会把一些资源放到 RetroShare ,这是一个很好的分享工具,如何使用请看使用 RetroShare 分享资源
2019-10-31-WPF-等距布局的更多相关文章
- WPF 等距布局
原文:WPF 等距布局 本文告诉大家如何使用 WPF 的自定义布局做等距布局. 实际做的效果很简单,因为在开发我容易就用到了等距的控件.等距控件就是在指定的宽度下,平均把控件放在水平的地方,这样相等于 ...
- lyc——2019.10.31
10:判决素数个数 总时间限制: 1000ms 内存限制: 65536kB 描述 输入两个整数X和Y,输出两者之间的素数个数(包括X和Y). 输入 两个整数X和Y(1 <= X,Y <= ...
- 牛客CSP-S提高组赛前集训营2 ———— 2019.10.31
比赛链接 期望得分:100+20+20 实际得分:40+20+30 awa cccc T1 :基于贪心的思路,然后开始爆搜(雾 那必然是会死的,好吧他就是死了 #include<iostrea ...
- WPF简单布局 浅尝辄止
WPF的窗口只能包含一个元素,为了在WPF窗口中放置多个元素并创建更实用的用户界面,需要在窗口上放置一个容器,然后在容器中放置其它元素. 注意:造成这一限制的原因是window类继承自 ...
- WPF UI布局之概述
在线演示:http://v.youku.com/v_show/id_XNzA5NDk2Mjcy.html 清晰版视频+代码下载:http://115.com/lb/5lbeer0m9lad 一.简单介 ...
- WPF(布局)
WPF编程学习——布局 本文目录 1.布局简介 2.面板(Panel) 3.视图框(Viewbox) 4.滚动视图控件(ScrollViewer) 5.公共布局属性 1.布局简介 应用程序界面 ...
- WPF常用布局介绍
概述:本文简要介绍了WPF中布局常用控件及布局相关的属性 1 Canvas Canvas是一个类似于坐标系的面板,所有的元素通过设置坐标来决定其在坐标系中的位置..具体表现为使用Left.Top.Ri ...
- ( 转)WPF面板布局介绍Grid、StackPanel、DockPanel、WrapPanel
回顾 上一篇,我们介绍了基本控件及控件的重要属性和用法,我们本篇详细介绍WPF中的几种布局容器及每种布局容器的使用场景,当 然这些都是本人在实际项目中的使用经验,可能还存在错误之处,还请大家指出. 本 ...
- WPF教程二:理解WPF的布局系统和常用的Panel布局
WPF的布局系统 了解元素的测量和排列方式是理解布局的第一步.在测量(measure)阶段容器遍历所有子元素,并询问子元素它们所期望的尺寸.在排列(arrange)阶段,容器在合适的位置放置子元素.理 ...
- 背水一战 Windows 10 (31) - 控件(按钮类): ButtonBase, Button, HyperlinkButton, RepeatButton, ToggleButton, AppBarButton, AppBarToggleButton
[源码下载] 背水一战 Windows 10 (31) - 控件(按钮类): ButtonBase, Button, HyperlinkButton, RepeatButton, ToggleButt ...
随机推荐
- Algorithms4th 1.1.25 欧几里得算法——数学归纳法证明
欧几里得算法的自然语言描述 计算两个非负整数p和q的最大公约数: 若q是0,则最大公约数为p.否则将p除以q得到余数r,p和q的最大公约数即为q和r的最大公约数. 数学归纳法证明 基础步骤: 若q = ...
- wait()和sleep()、sleep()和yield()的区别
wait()和sleep()的区别主要表现在一下几个方面: 原理不同.sleep()方法是Thread类的静态方法,是线程用来控制自身流程的.它会使线程暂停执行一段时间,把执行机会让给其他线程,等到时 ...
- python 中 len()和range()
https://blog.csdn.net/qq_36357820/article/details/77850841
- Mongodb Capped Collection集合
MongoDB 固定集合(Capped Collections)是性能出色且有着固定大小的集合,对于大小固定,我们可以想象其就像一个环形队列,当集合空间用完后,再插入的元素就会覆盖最初始的头部的元素! ...
- TCP协议的简单应用一
TCP协议的应用,实现一个服务器处理多个客户端请求(向服务器发送消息,服务器接收到后以原消息返回给客户端.) 客户端类 import java.io.*; import java.net.Socket ...
- Kettle解析JSON错误,We MUST have the same number of values for all paths,We can not find and data with path [$.
最近公司要从聚石塔上抽取数据,其中有JSON格式数据,所以学习一下Kettle解析JSON,碰到小小问题,记录一下: (1) 2015/07/15 15:22:48 - trade_detail.0 ...
- Arrays.asList()报错java.lang.UnsupportedOperationException
问题: 使用工具类Arrays.asList()方法把数组转换成集合时,不能使用修改集合相关的方法,比如add,remove.这个ArrayList是Arrays类自己定义的一个内部类!这个内部类没有 ...
- HTML5浏览器
你可以学会如何使用旧的浏览器正确处理新的HTML5. HTML5 浏览器支持 HTML5 支持所有现代浏览器. 此外,所有的浏览器,旧的和新的,自动处理未被识别的元素作为内联元素. 因为这样,你可以& ...
- vim编辑器的使用技巧——忽略字母大小写
一忽略字母大小写临时生效 底行模式 底行模式下输入set ic 注意ic是ignorecase的缩写 命令模式 命令模式进行关键字搜索 二忽略字母大小写永久生效 保存到配置文件里面,默认是没有此配置 ...
- IDEA使用Maven的第一个测试
创建完成后,点击这个按钮.进行配置. 选择第二个就行了. 然后选择这个去配置tomcat.