首页 > 其他分享 >WPF 等距布局

WPF 等距布局

时间:2024-10-11 12:21:58浏览次数:3  
标签:控件 等距 temp 布局 var new WPF size Size

本文告诉大家如何使用 WPF 的自定义布局做等距布局

实际做的效果很简单,因为在开发我容易就用到了等距的控件。等距控件就是在指定的宽度下,平均把控件放在水平的地方,这样相等于 StackPanel 的水平,但是没有做水平压缩。在这个控件,无论在水平放多少个控件,都会在相同的高度把他们放下。如果里面的控件的宽度不相同,那么这些控件拿到的可以使用的宽度都是相同。

请看下面的图片

WPF 等距布局_控件

上面图片是存在 6 个按钮的,所有的按钮使用的宽度都是一样

现在修改为 3 个按钮,可以看到说有按钮都是相同

WPF 等距布局_WPF_02

现在加两个宽度很小的文本,可以看到文本可以的宽度和按钮一样

WPF 等距布局_ide_03

下面让我告诉大家这个控件是如何做。

在 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;
        }
    }










标签:控件,等距,temp,布局,var,new,WPF,size,Size
From: https://blog.51cto.com/u_11283245/12217451

相关文章

  • 2019-7-12-wpf-VisualBrush-已知问题
    titleauthordateCreateTimecategorieswpfVisualBrush已知问题lindexi2019-7-1221:7:41+08002018-2-1317:23:3+0800WPF本文告诉大家,visualBrush已知bug,希望大家使用VisualBrush时可以知道如果把VisualBrush绑定的是在元素加入到视觉树前,那么在元素加入到视觉树之后移除......
  • JVM系列(四) -内存布局详解
    一、摘要熟悉Java语言特性的同学都知道,相比C、C++等编程语言,Java无需通过手动方式回收内存,内存中所有的对象都可以交给Java虚拟机来帮助自动回收;而像C、C++等编程语言,需要开发者通过代码手动释放内存资源,否则会导致内存溢出。尽管如此,如果编程不当,Java应用程序......
  • WPF Image display webp via BitMapImgae BeginInit UriSource EndInit in MVVM
    privatevoidGenenerateBitMapImageViaUrl(stringurl){BitmapImagebmi=newBitmapImage();bmi.BeginInit();bmi.UriSource=newUri(url,UriKind.RelativeOrAbsolute);bmi.EndInit();if(bmi.CanFreeze){bmi.Freeze();}......
  • 开源项目更新|WPF/Uno Platform/WinUI 3三个版本的《英雄联盟客户端》
    ​哈喽大家好!我们是中韩MicrosoftMVP夫妇Vicky&James^^很高兴能加入博客园和大家分享我们的技术!自2008年以来,我们一直深耕于WPF技术,积累了丰富的经验。这些年来,随着Xamarin、MAUI、Uno-Platform、AvaloniaUI和OpenSilver等跨平台技术的不断发展,我们也将在WPF中积累的技能成功......
  • WPF 实现点击空白位置让TextBox等失焦
    在使用WPF开发桌面应用时,可能会遇到一个常见需求:当用户在界面上点击某个控件之外的空白区域时,当前获得焦点的控件(例如TextBox、ComboBox等)自动失去焦点。这种体验在一些场景下非常实用,尤其是当你希望用户在点击其他地方后完成对输入控件的编辑操作时。本文将介绍如何在......
  • CSS Flex 布局教程
    简介弹性盒子是CSS3的一种新的布局模式。CSS3弹性盒(FlexibleBox或flexbox),是一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有恰当的行为的布局方式。引入弹性盒布局模型的目的是提供一种更加有效的方式来对一个容器中的子元素进行排列、对齐和分配空白......
  • DevExpress WPF中文教程:如何解决数据更新的常见问题?
    DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。无论是Office办公软件的衍伸产品,还是以数据为......
  • 仓库布局对拣选效率的影响
    根据国外研究,拣货过程中最耗时的部分是移动,平均占用拣货人员的55%的时间,其次是纸质单据填写和其他活动(20%)、查找货物(15%)和搬运货物(10%)。出于这个原因,围绕改进拣货流程的大部分工作是在减少查找货物及移动时间。精明的仓库管理者利用80/20规则来提高拣货效率。既20%的产品......
  • DevExpress WPF中文教程:如何解决数据更新的常见问题?
    DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。无论是Office办公软件的衍伸产品,还是以数据为中心......
  • OBOO鸥柏:布局于为展厅展馆元宇宙产业提供LCD液晶显示终端
    新华网快讯,于10月7日消息,有投资者在互动平台向OBOO鸥柏提问:您好请问作为中国专注于商用液晶显示屏领域的科技公司,公司有哪些工业/商用显示产品应用于展厅展馆场景单位?能否着重介绍下贵司和展厅展馆合作如何保障如何破局?鸥柏科技(OBOO鸥柏)总经理朱琦飞回答表示:公司旗下品牌“......