WPF 用代码实现WrapPanel右侧自动对齐(解决多余空白问题)

WPF 用代码实现WrapPanel右侧自动对齐(解决多余空白问题)未处理前效果:处理后效果:<BorderBackground=”{StaticResourceBorderBg}”BorderThickness=”2″BorderBrush=”{StaticResourceBorderBrush}”CornerRadius=”5″Padding=”5″x:Name=”SvKeyWords”Margi…

大家好,又见面了,我是你们的朋友全栈君。

未处理前效果: 

 WPF 用代码实现WrapPanel右侧自动对齐(解决多余空白问题)

WPF 用代码实现WrapPanel右侧自动对齐(解决多余空白问题)

处理后效果: 

WPF 用代码实现WrapPanel右侧自动对齐(解决多余空白问题)

WPF 用代码实现WrapPanel右侧自动对齐(解决多余空白问题)

<Border  Background="{StaticResource BorderBg}"  BorderThickness="2" BorderBrush="{StaticResource BorderBrush}" CornerRadius="5" Padding="5"   x:Name="SvKeyWords" Margin="142,0,134,58" Height="175" VerticalAlignment="Bottom" Visibility="Collapsed"  Opacity="0.98">
       <ScrollViewer VerticalScrollBarVisibility="Auto" >
            <WrapPanel x:Name="WpKeyWords"/>
       </ScrollViewer>
 </Border>
        private void AlignWrapPanelChild()
        {
            //WrapPanel 所有子元素
            var lst = (from object child in WpKeyWords.Children select child as Border).ToList();
            if (lst.Count > 1)
            {
                //每次 重置 子元素宽度
                foreach (var t in lst)
                {
                    t.Width = double.NaN;
                    t.UpdateLayout();
                }

                for (var i = 0; i < lst.Count - 1; i++)
                {
                    //找到每行最后一个子元素
                    var child = lst[i];
                    var nxtChild = lst[i + 1];
                    var plWidth = WpKeyWords.ActualWidth;
                    var childPoint = child.TranslatePoint(new Point(0, 0), WpKeyWords);
                    var nxtChildPoint = nxtChild.TranslatePoint(new Point(0, 0), WpKeyWords);
                    if (nxtChildPoint.X < childPoint.X)
                    {
                        //找出同一行的子元素
                        var tempLst = lst.Where(b => b.TranslatePoint(new Point(0, 0), WpKeyWords).Y.Equals(childPoint.Y)).ToList();
                        //算出多余的空白宽度
                        var surplusWidth = plWidth - childPoint.X - child.Margin.Right - child.ActualWidth;
                        var averageAddWidth = surplusWidth / tempLst.Count;
                        //将多余的宽度平均分给当前行每个子元素
                        foreach (var b in tempLst)
                        {
                            b.Width = b.ActualWidth + averageAddWidth;
                            b.UpdateLayout();
                        }
                    }

                }
            }
        }

在数据绑定或者初始化控件后调用 

private void do()
{
    ……
    WpKeyWords.SizeChanged += delegate { AlignWrapPanelChild(); };
    AlignWrapPanelChild();
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163325.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vagrant up提示“Couldn‘t open file /path/to/base“的错误解决方法

    vagrant up提示“Couldn‘t open file /path/to/base“的错误解决方法

    2021年10月28日
    57
  • FireEye:2012年下半年高级威胁分析报告

    FireEye:2012年下半年高级威胁分析报告

    2021年8月22日
    53
  • acwing-246. 区间最大公约数(线段树+gcd)[通俗易懂]

    acwing-246. 区间最大公约数(线段树+gcd)[通俗易懂]给定一个长度为 N 的数列 A,以及 M 条指令,每条指令可能是以下两种之一:C l r d,表示把 A[l],A[l+1],…,A[r] 都加上 d。Q l r,表示询问 A[l],A[l+1],…,A[r] 的最大公约数(GCD)。对于每个询问,输出一个整数表示答案。输入格式第一行两个整数 N,M。第二行 N 个整数 A[i]。接下来 M 行表示 M 条指令,每条指令的格式如题目描述所示。输出格式对于每个询问,输出一个整数表示答案。每个答案占一行。数据范围N≤500000,M≤1

    2022年8月9日
    8
  • STM32的指令周期[通俗易懂]

    STM32的指令周期[通俗易懂]在keil中编程时,写了一行代码,然后就想知道,执行这句C代码需要多长时间。时钟周期在这就不解释了,频率的倒数。指令周期,个人理解就是cpu执行一条汇编指令所需要的时间。我们知道cm3使用的三级流水线,那么到底一条指令的执行需要多少个时钟周期。下面通过keil软件仿真,来计算一个指令所需的时钟周期。 使用STM32F103RC,。配置其主时钟HCLK为72mhz测试代码如下:…

    2022年10月13日
    5
  • C语言system的用法「建议收藏」

    C语言system的用法「建议收藏」C语言system的用法system()在头文件stdlib.h中system()是C语言中为了调用windows系统命令来设置。例:system(“cls”);//清屏system(“pause”);//暂停system(“title名字”);//设置窗口名system(“time/T”);//显示当前时间system(“data/T”);//显示当前日期system(“…

    2022年9月18日
    3
  • java dom4j 查找_java dom4j根据条件读取查找xml节点的方法

    java dom4j 查找_java dom4j根据条件读取查找xml节点的方法1.假如有下面的books.xml要用javadom4j解析查找。LuceneStudingDom4jTutorialsSpringinActionO’Reilly2.下面我们使用dom4j的xPath来解析:publicvoidparseBooks(){SAXReaderreader=newSAXReader();try{Documentdoc=reader.rea…

    2022年7月26日
    18

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号