大家好,又見面了,我是你們的朋友全棧君。
未處理前效果:

處理後效果:
<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.cn/163325.html原文連結:https://javaforall.cn