WPF 用代码实现WrapPanel右侧自动对齐(解决多余空白问题)
未处理前效果:
处理后效果:
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 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();}