WPF 等距布局
原文:WPF 等距布局 本文告诉大家如何使用 WPF 的自定义布局做等距布局。 实际做的效果很简单,因为在开发我容易就用到了等距的控件。等距控件就是在指定的宽度下,平均把控件放在水平的地方,这样相等于 StackPanel 的水平,但是没有做水平压缩。在这个控件,无论在水平放多少个控件,都会在相同的高度把他们放下。如果里面的控件的宽度不相同,那么这些控件拿到的可以使用的宽度都是相同。 请看下面的图片 上面图片是存在 6 个按钮的,所有的按钮使用的宽度都是一样 现在修改为 3 个按钮,可以看到说有按钮都是相同 现在加两个宽度很小的文本,可以看到文本可以的宽度和按钮一样 下面让我告诉大家这个控件是如何做。 在 WPF 做自己的面板可以继承Panel ,可以重写两个方法,第一个方法是 MeasureOverride ,重写这个方法可以告诉上一级控件,这个控件需要多大的空间。第二个方法是 ArrangeOverride 告诉元素可以怎么放。 下面创建一个类 KbiseczvTom 这是等距控件。 首先重写MeasureOverride,因为需要的一般只是做水平等距,所以就需要拿到元素的宽度和高度,把所有的宽度合起来作为这个控件需要的最小宽度,然后拿到所有控件的最大高度作为这个控件的需要高度。虽然从 MeasureOverride 返回了大小,但是实际上的上一级控件是不是最后给这么大的,还是不知道的。 在调用 Measure 传入无穷是因为这是需要让元素告诉控件需要的最大大小。 然后就是重写 ArrangeOverride ,传入的参数就是上一级控件给这个控件的大小,返回值就是实际需要的大小。现在可以使用元素的 Arrange 通过这个可以把元素给元素的大小,左上角。但是元素是不是就听话,实际上还是不知道的。首先拿到元素数,把拿到的宽度除元素得到一个元素可以使用宽度,然后把每个元素按照顺序给左上角,宽度。 现在打开界面写下面代码试试 所有代码: 源代码:WPF 等距布局-CSDN下载 因为现在的 csdn 是需要下载积分,所以我会把一些资源放到 RetroShare ,这是一个很好的分享工具,如何使用请看使用 RetroShare 分享资源 本文会经常更新,请阅读原文:
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;
}
<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;
}
}
https://lindexi.gitee.io/lindexi/post/WPF-%E7%AD%89%E8%B7%9D%E5%B8%83%E5%B1%80.html
,以避免陈旧错误知识的误导,同时有更好的阅读体验。
本作品采用
知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:
https://lindexi.gitee.io
),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请
与我联系
。
WPF 等距布局的更多相关文章
- WPF 之 布局(一)
WPF的布局控件都在 System.Windows.Controls.Panel 这个基类下面,使用 WPF提供的各种控件在WPF应用程序中界面进行布局,同时对各种子控件(如按钮.文本框,下拉框等)进 ...
- 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之布局 上一章大家有了自己的一个Hello World的wpf程序,今天咱们就一起走进WPF,一起来看看wpF的前台xaml这门语言的魅力. 写过web 的人都知道布局这个概念,在web中布局和 ...
- WPF常用布局介绍
概述:本文简要介绍了WPF中布局常用控件及布局相关的属性 1 Canvas Canvas是一个类似于坐标系的面板,所有的元素通过设置坐标来决定其在坐标系中的位置..具体表现为使用Left.Top.Ri ...
- wpf(布局与Canvas )
WPF的布局有控件都在System.Windows.Controls.Panel这个基类下面,常见的布局控件: . canvas: Canvas是最基本的面板,它不会自动调整内部元素的排列及大小,它仅 ...
- 【WPF】 布局篇
[WPF] 布局篇 一. 几个常用且至关重要的属性 1. Width,Height : 设置窗体,控件宽高. 这里注意,WPF是自适应的, 所以把这2个属性设置 Auto, 则控件宽高会自动改变. 2 ...
- Wpf的布局舍入属性(可以解决软件字体模糊的问题)
原文:Wpf的布局舍入属性(可以解决软件字体模糊的问题) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/HK_JY/article/details/ ...
随机推荐
- 【转】排列组合 "n个球放入m个盒子m"问题 总结
出处:https://blog.csdn.net/qwb492859377/article/details/50654627 球,盒子都可以分成是否不能区分,和能区分,还能分成是否能有空箱子,所以一共 ...
- Java基础学习总结(28)——Java对各种排序算法的实现
这里总结下各种排序算法的java实现 冒泡排序 public class BubbleSort { publicstaticint[] bubbleSort(int[] array) { if(arr ...
- uva_658_It's not a Bug, it's a Feature!(最短路)
It's not a Bug, it's a Feature! Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & ...
- [算法系列之二十七]Kruskal最小生成树算法
简单介绍 求最小生成树一共同拥有两种算法,一个是就是本文所说的Kruskal算法,还有一个就是Prime算法. 在具体解说Kruskal最小生成树算法之前,让我们先回想一下什么是最小生成树. 我们有一 ...
- SpringMVC实战(三种控制器方式)
1.前言 上篇博客着重说了一下SpringMVC中几种处理映射的方式,这篇博客来说一下SpringMVC中几种经常使用的控制器. 2.经常使用控制器 2.1 ParameterizableViewC ...
- php课程 10-34 目录遍历中的注意事项是什么
php课程 10-34 目录遍历中的注意事项是什么 一.总结 一句话总结:用scandir,会把目录和文件放到一个数组中. 1.移动文件怎么实现,php里面没有移动文件这个函数? 先复制,再删除 2 ...
- FZU 2020 组合
组合数求模要用逆元,用到了扩展的欧几里得算法. #include<cstdio> int mod; typedef long long LL; void gcd(LL a,LL b,LL ...
- GDB如何调试没有符号表(未加-g选项的编译)的程序
/********************************************************************* * Author : Samson * Date ...
- Bootstrap相关优质项目学习清单
1:编码规范 by @mdo编写灵活.稳定.高质量的 HTML 和 CSS 代码的规范 http://codeguide.bootcss.com/ 2:快速.可靠.安全的依赖管理工具.Yarn 缓存了 ...
- View的事件分发机制解析
引言 Android事件构成 在Android中,事件主要包含点按.长按.拖拽.滑动等,点按又包含单击和双击,另外还包含单指操作和多指操作.全部这些都构成了Android中的事件响应.总的来说.全部的 ...