WPF 自适应布局控件

    public class KDLayoutGroup : Grid
    {
        public double LabelWidth { get; set; }

        public double GetLabelWidth()
        {
            return LabelWidth;
        }

        public void SetLabelWidth(double value)
        {
            if (this.Parent is KDLayoutControl)
            {
                double w = (this.Parent as KDLayoutControl).GetLableWidth();
                if (w < value)
                {
                    (this.Parent as KDLayoutControl).SetLabelWidth(value);
                }

                for (int i = 0; i < Children.Count; i++)
                {

                    SetBatchLabelWidth(Children[i], value);
                }

            }
        }

        protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
        {
            if (Children.Count == this.ColumnDefinitions.Count)
                return;

            for (int i = 0; i < Children.Count; i++)
            {
                var column = new ColumnDefinition();
                //column.Width = new GridLength(0,GridUnitType.Auto);
                this.ColumnDefinitions.Add(column);

                Children[i].SetValue(Grid.ColumnProperty, i);

                SetBatchLabelWidthOther(Children[i]);

            }

            base.OnRenderSizeChanged(sizeInfo);
        }

        private void SetBatchLabelWidth(UIElement el, double value)
        {
            if (el is KDLayoutItem)
            {
                double width = (el as KDLayoutItem).GetLabelWidht();
                if (width < value)
                {
                    (el as KDLayoutItem).SetLabelWidht(value);
                }
            }
            else
            {
                if (el is Panel)
                {
                    var cs = (el as Panel).Children;
                    for (int i = 0; i < cs.Count; i++)
                    {
                        SetBatchLabelWidth(cs[i], value);
                    }
                }

            }
        }

        private void SetBatchLabelWidthOther(UIElement el)
        {
            if (el is KDLayoutItem)
            {

                double width = (el as KDLayoutItem).GetLabelWidht();
                if (width > LabelWidth)
                {
                    LabelWidth = width;
                    SetLabelWidth(width);
                }
            }
            else
            {
                if (el is Panel)
                {
                    var cs = (el as Panel).Children;
                    for (int i = 0; i < cs.Count; i++)
                    {
                        SetBatchLabelWidthOther(cs[i]);
                    }
                }

            }
        }
    }
 public class KDLayoutControl : StackPanel
    {

        public double LabelWidth { get; set; }
        public double GetLableWidth()
        {
            return LabelWidth;
        }

        public void SetLabelWidth(double value)
        {
            LabelWidth = value;

            for (int i = 0; i < Children.Count; i++)
            {
                if ((Children[i] as KDLayoutGroup).GetLabelWidth() < LabelWidth)
                {
                    (Children[i] as KDLayoutGroup).SetLabelWidth(LabelWidth);
                }
            }
        }

        protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
        {
            for (int i = 0; i < Children.Count; i++)
            {

                if ((Children[i] as KDLayoutGroup).GetLabelWidth() > LabelWidth)
                {
                    LabelWidth = (Children[i] as KDLayoutGroup).GetLabelWidth();
                }
            }

            SetLabelWidth(LabelWidth);

            base.OnRenderSizeChanged(sizeInfo);
        }
    }
<UserControl x:Class="PHMES.UI.Base.KDLayoutItem"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:PHMES.UI.Base"
             mc:Ignorable="d"
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Template>
        <ControlTemplate TargetType="local:KDLayoutItem">
            <DockPanel>
                <Label  x:Name="lbl" VerticalAlignment="Center"  VerticalContentAlignment="Center" Content="{TemplateBinding Label}"  />
                <ContentPresenter/>
            </DockPanel>
        </ControlTemplate>
    </UserControl.Template>
</UserControl>
 public partial class KDLayoutItem : UserControl
    {
        public KDLayoutItem()
        {
            InitializeComponent();
        }
        public object Label
        {
            get { return (object)GetValue(LabelProperty); }
            set
            {
                SetValue(LabelProperty, value);
            }
        }

        // Using a DependencyProperty as the backing store for Label.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty LabelProperty =
            DependencyProperty.Register("Label", typeof(object), typeof(KDLayoutItem), new PropertyMetadata(null));

        public double GetLabelWidht()
        {
            return (this.Template.FindName("lbl",this) as Label).ActualWidth;
        }
        public void SetLabelWidht(double width)
        {
            (this.Template.FindName("lbl", this) as Label).SetValue(WidthProperty,width);
        }
    }

功能类似dev的layoutcontrol,layoutgroup,layoutitem.

用法如下:

<Window x:Class="AutoWidthTest.MainWindow"
        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:AutoWidthTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <local:KDLayoutControl>
        <local:KDLayoutGroup Height="50" VerticalAlignment="Top"  Margin="3">
            <local:KDLayoutItem Label="aaa">
                <TextBox />
            </local:KDLayoutItem>
            <local:KDLayoutItem Label="bbb">
                <TextBox />
            </local:KDLayoutItem>
            <local:KDLayoutItem Label="ccc">
                <TextBox />
            </local:KDLayoutItem>
        </local:KDLayoutGroup>
        <local:KDLayoutGroup Height="50" VerticalAlignment="Top"  Margin="3">
            <local:KDLayoutItem Label="number">
                <TextBox />
            </local:KDLayoutItem>
            <local:KDLayoutItem Label="name">
                <TextBox />
            </local:KDLayoutItem>
            <local:KDLayoutItem Label="age">
                <TextBox />
            </local:KDLayoutItem>
        </local:KDLayoutGroup>
        <local:KDLayoutGroup Height="50" VerticalAlignment="Top" Margin="3">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <local:KDLayoutItem Label="a">
                    <TextBox />
                </local:KDLayoutItem>
                <local:KDLayoutItem Label="b" Grid.Column="1" Grid.ColumnSpan="2">
                    <TextBox />
                </local:KDLayoutItem>
            </Grid>
        </local:KDLayoutGroup>
    </local:KDLayoutControl>
</Window>

不管label字段有多长,KDLayoutControl会设置容器内所有的label长度一致。

原文地址:https://www.cnblogs.com/czly/p/11121916.html

时间: 2024-11-04 13:14:55

WPF 自适应布局控件的相关文章

WPF 布局控件 之 DockPanel

DockPanel为容器控件 主要了解其Dock属性和LastChildFill属性的使用 一.LastChildFill="True" 时 代码: <DockPanel LastChildFill="True"> <Button DockPanel.Dock="Top">Top</Button> <Button DockPanel.Dock="Bottom">Bottom<

WPF布局控件常用属性介绍

WPF布局控件常用属性介绍 其它 | 作者:慧都控件网 | 2011-04-06 13:41:57| 阅读 0次 有用(0) 评论(0) 概述:WPF布局控件都是派生自System.Windows.Controls.Panel抽象类的面板,Panel类继承自 FrameworkElement,Panel类本身并没有什么特别的,但是WPF中提供了许多用于布局的控件都继承自Panel类,如 StackPanel控件,WrapPanel,DockPanel,Grid,UniformGrid,Canva

WPF的ListView控件自定义布局用法实例

本文实例讲述了WPF的ListView控件自定义布局用法.分享给大家供大家参考,具体如下: 概要: 以源码的形式贴出,免得忘记后,再到网上查资料.在VS2008+SP1环境下调试通过 引用的GrayscaleEffect模块,可根据参考资料<Grayscale Effect...>中的位置下载. 正文: 如何布局是在App.xaml中定义源码如下 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

WPF自学入门(二)WPF-XAML布局控件

上一篇介绍了xaml基本知识,我们已经知道了WPF简单的语法.那么接下来,我们要认识一下WPF的布局容器.布局容器可以使控件按照分类显示,我们一起来看看WPF里面可以使用哪些布局容器用来布局. 在WPF中,布局是由布局容器来完成的,容器里面是可以放控件,容器里面也可以放容器.而在WPF中,布局容器有很多,下面主要介绍最常用的几种布局容器, 下面分别介绍StackPanel,WarpPanel,DockPanel,Grid,Canvas五种布局容器 一.StackPanel 在WPF中StackP

布局控件Grid

XAML概述 Silverlight的控件绘制是由XAML语言进行支持的.什么是XAML语言? 简单的说,XAML(Extensible Application Markup Language )是一款基于XML的描述性语言,中文也叫做可扩展应用程序标记语言. 该语言是由微软开发创建,主要用于构建WPF和Silverlight应用程序用户界面.XAML是Silverlight用户界面设计的基础,使用XAML可以定义Silverlight对象以及属性,相对于后台语言定义控件来说,XAML提供了非常

Expression Blend实例中文教程(3) - 布局控件快速入门Grid

上一篇对Blend 3开发界面进行了快速入门介绍,本篇将基于Blend 3介绍Silverlight控件.对于微软开发工具熟悉的朋友,相信您很快就熟悉Blend的开发界面和控件. XAML概述 Silverlight的控件绘制是由XAML语言进行支持的.什么是XAML语言? 简单的说,XAML(Extensible Application Markup Language )是一款基于XML的描述性语言,中文也叫做可扩展应用程序标记语言. 该语言是由微软开发创建,主要用于构建WPF和Silverl

WPF中Ribbon控件的使用

这篇博客将分享如何在WPF程序中使用Ribbon控件.Ribbon可以很大的提高软件的便捷性. 上面截图使Outlook 2010的界面,在Home标签页中,将所属的Menu都平铺的布局,非常容易的可以找到想要的Menu.在Outlook 2003时代,将Home下面的Menu都垂直的排列下来,操作的便捷程度降低了很多.Ribbon的布局会随着窗体的变化动态的调整. 上面的图片中标注了Ribbon的4个区块. 下面我们就在WPF中使用Ribbon控件来实现一个简单的界面. 1. 添加System

Wpf使用Winform控件后Wpf元素被Winform控件遮盖问题的解决

有人会说不建议Wpf中使用Winform控件,有人会说建议使用Winform控件在Wpf下的替代方案,然而在实际工作中由于项目的特殊需求,考虑到时间.成本等因素,往往难免会碰到在WPF中使用Winfrom控件的问题,我们知道Wpf可以通过使用WindowsFormsHost容器调用Winform控件,但是在一些场合需要将Wpf元素显示在Winform控件的上层,此时就会出现Wpf元素被Winform控件遮盖的问题. 一.场景再现 接到公司命令,在时间紧迫的情况下,需要将原来的Winform程序(

在WPF程序中将控件所呈现的内容保存成图像(转载)

在WPF程序中将控件所呈现的内容保存成图像 转自:http://www.cnblogs.com/TianFang/archive/2012/10/07/2714140.html 有的时候,我们需要将控件所呈现的内容保存成图像保存下来,例如:InkCanvas的手写墨迹,WebBrowser中的网页等.可能有人会说,这个不就是截图嘛,找到控件的坐标和大小,调用截图API不就可以了嘛.的确,对于规则的控件来说,通过截图的却可以实现,可是,如果控件不规则或不透明度不是100%,则会把其背景控件的视觉效