求助如何使用WPF控件自适应宽度

戒烟客 2012-03-07 09:49:22
想实现如WIN7下的任务栏效果,截图:

当 只有一两个 控件时 :


当出现很多控件时自动调整宽度如下图:


...全文
774 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
nonocast 2012-03-09
  • 打赏
  • 举报
回复
恩,用Grid就OK了,我想多了
戒烟客 2012-03-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 kongxh_1981 的回复:]

根本就不需要计算那么麻烦.
放一个grid,然后,有一个元素就增加一列,设置列的最大宽度为你要的数值,然后再设置列宽为*.
这样的话,你的列加的越多,那么每一列酒会压缩的越窄,列越少,则每一列都不会超过最大宽度。
C# code

<Grid Width="200" ShowGridLines="True">
<Grid.ColumnDefinitions>
……
[/Quote]

非常感谢!!!
nonocast 2012-03-08
  • 打赏
  • 举报
回复
恩,自己写Layout,override measure/arrange
白色的海 2012-03-08
  • 打赏
  • 举报
回复
根本就不需要计算那么麻烦.
放一个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的特性,就不需要再计算了,
你只管管理元素的增减,以及显示效果了。
戒烟客 2012-03-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 nonocast 的回复:]

写反了,如果控件需要的Width大于Panel则均分,否则按期望尺寸显示...
[/Quote]
您的代码可以实现我的功能,但是能不能通过 WPF 也就是XAML代码完成这个效果呢?
nonocast 2012-03-08
  • 打赏
  • 举报
回复
写反了,如果控件需要的Width大于Panel则均分,否则按期望尺寸显示...
nonocast 2012-03-08
  • 打赏
  • 举报
回复
大概写了一下,如果比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;
}
}
DENQH 2012-03-07
  • 打赏
  • 举报
回复
WPF在任务栏属性里设置
戒烟客 2012-03-07
  • 打赏
  • 举报
回复
我想在我的软件里面实现
mizuho_2006 2012-03-07
  • 打赏
  • 举报
回复
WPF在任务栏里不是自适应宽度的吗

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧