求助如何使用WPF控件自适应宽度 想实现如WIN7下的任务栏效果,截图:当 只有一两个 控件时 :当出现很多控件时自动调整宽度如下图: 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 WPF在任务栏里不是自适应宽度的吗 恩,自己写Layout,override measure/arrange 大概写了一下,如果比Panel尺寸大则正常显示,否则根据数量均分public class SampleLayout : Panel { public SampleLayout() { this.Background = Brushes.Yellow; } protected override Size MeasureOverride(Size availableSize) { double height = 0.0; foreach (UIElement each in InternalChildren) { each.Measure(availableSize); height = Math.Max(height, each.DesiredSize.Height); } return new Size(availableSize.Width, height); } protected override Size ArrangeOverride(Size finalSize) { var desiredWidth = InternalChildren.Cast<UIElement>().Sum(p => p.DesiredSize.Width); if (desiredWidth <= finalSize.Width) { var nextChildLeft = 0.0; foreach (UIElement each in InternalChildren) { each.Arrange(new Rect(new Point(nextChildLeft, 0), each.DesiredSize)); nextChildLeft += each.DesiredSize.Width; } } else { var nextChildLeft = 0.0; var avaWidth = finalSize.Width / InternalChildren.Count; foreach (UIElement each in InternalChildren) { each.Arrange(new Rect(new Point(nextChildLeft, 0), new Size(avaWidth, each.DesiredSize.Height))); nextChildLeft += avaWidth; } } return finalSize; }} 写反了,如果控件需要的Width大于Panel则均分,否则按期望尺寸显示... 您的代码可以实现我的功能,但是能不能通过 WPF 也就是XAML代码完成这个效果呢? 根本就不需要计算那么麻烦.放一个grid,然后,有一个元素就增加一列,设置列的最大宽度为你要的数值,然后再设置列宽为*.这样的话,你的列加的越多,那么每一列酒会压缩的越窄,列越少,则每一列都不会超过最大宽度。<Grid Width="200" ShowGridLines="True"> <Grid.ColumnDefinitions> <ColumnDefinition MaxWidth="50" Width="*"/> <ColumnDefinition MaxWidth="50" Width="*"/> <ColumnDefinition MaxWidth="50" Width="*"/> <ColumnDefinition MaxWidth="50" Width="*"/> <ColumnDefinition MaxWidth="50" Width="*"/> <ColumnDefinition MaxWidth="50" Width="*"/> <ColumnDefinition MaxWidth="50" Width="*"/> </Grid.ColumnDefinitions> <Label Grid.Column="0">aaaaaaaaaaaaaa</Label> <Label Grid.Column="1">bbbbbbbbbbbb</Label> <Label Grid.Column="2">cccccccccccccc</Label> <Label Grid.Column="3">dddddddddddddd</Label> <Label Grid.Column="4">eeeeeeeeeeeeee</Label> <Label Grid.Column="5">fffffffffffffff</Label> <Label Grid.Column="6">ggggggggggggggg</Label> </Grid>上面的代码是效果,真实去作的话,还是要写代码的,但是利用grid的特性,就不需要再计算了,你只管管理元素的增减,以及显示效果了。 发帖求救!SOS!拼音输入法问题? 委托的问题~~急,在线等 大家帮忙看看拆分文档【循环报错数值超出范围】 在asp.net(c#)中如何实现文件的复制与删除? 怎么样判断鼠标在这三角形区域内 如何得到window任务栏的高度或坐标 谁能举例说明白Match,Group,Capture的关系? 有一个Bitmap 文件, 我想知道怎么叫调用reference,怎么叫create a duplicate? 谢谢。 C# 自动编号 从功能角度分析.NET构架、含义、功能。 string???xml???? C#有关POP3 SSL验证的问题
public SampleLayout() {
this.Background = Brushes.Yellow;
} protected override Size MeasureOverride(Size availableSize) {
double height = 0.0;
foreach (UIElement each in InternalChildren) {
each.Measure(availableSize);
height = Math.Max(height, each.DesiredSize.Height);
}
return new Size(availableSize.Width, height);
} protected override Size ArrangeOverride(Size finalSize) {
var desiredWidth = InternalChildren.Cast<UIElement>().Sum(p => p.DesiredSize.Width);
if (desiredWidth <= finalSize.Width) {
var nextChildLeft = 0.0;
foreach (UIElement each in InternalChildren) {
each.Arrange(new Rect(new Point(nextChildLeft, 0), each.DesiredSize));
nextChildLeft += each.DesiredSize.Width;
}
} else {
var nextChildLeft = 0.0;
var avaWidth = finalSize.Width / InternalChildren.Count;
foreach (UIElement each in InternalChildren) {
each.Arrange(new Rect(new Point(nextChildLeft, 0), new Size(avaWidth, each.DesiredSize.Height)));
nextChildLeft += avaWidth;
}
}
return finalSize;
}
}
放一个grid,然后,有一个元素就增加一列,设置列的最大宽度为你要的数值,然后再设置列宽为*.
这样的话,你的列加的越多,那么每一列酒会压缩的越窄,列越少,则每一列都不会超过最大宽度。<Grid Width="200" ShowGridLines="True">
<Grid.ColumnDefinitions>
<ColumnDefinition MaxWidth="50" Width="*"/>
<ColumnDefinition MaxWidth="50" Width="*"/>
<ColumnDefinition MaxWidth="50" Width="*"/>
<ColumnDefinition MaxWidth="50" Width="*"/>
<ColumnDefinition MaxWidth="50" Width="*"/>
<ColumnDefinition MaxWidth="50" Width="*"/>
<ColumnDefinition MaxWidth="50" Width="*"/>
</Grid.ColumnDefinitions>
<Label Grid.Column="0">aaaaaaaaaaaaaa</Label>
<Label Grid.Column="1">bbbbbbbbbbbb</Label>
<Label Grid.Column="2">cccccccccccccc</Label>
<Label Grid.Column="3">dddddddddddddd</Label>
<Label Grid.Column="4">eeeeeeeeeeeeee</Label>
<Label Grid.Column="5">fffffffffffffff</Label>
<Label Grid.Column="6">ggggggggggggggg</Label>
</Grid>
上面的代码是效果,真实去作的话,还是要写代码的,但是利用grid的特性,就不需要再计算了,
你只管管理元素的增减,以及显示效果了。