WPF笔记(2.9和2.10)——Layout
2.9讲的是,如果内部设定超过容器大小,怎么办?
StackPanel会裁剪越界部分
DockPanel和Grid会智能判断,从而决定换行。
2.10 自定义布局容器
自定义容器要实现两个方法MeasureOverride和ArrangeOverride,并保证遍历其下的所有子控件,使他们都执行Measure和Arrange方法。
using System;
using System.Windows.Controls;
using System.Windows;
namespace CustomPanel {
public class DiagonalPanel : Panel {
protected override Size MeasureOverride( Size availableSize ) {
double totalWidth = 0;
double totalHeight = 0;
foreach( UIElement child in Children ) {
child.Measure( new Size( double.PositiveInfinity,
double.PositiveInfinity ) );
Size childSize = child.DesiredSize;
totalWidth += childSize.Width;
totalHeight += childSize.Height;
}
return new Size( totalWidth, totalHeight );
}
protected override Size ArrangeOverride( Size finalSize ) {
Point currentPosition = new Point( );
foreach( UIElement child in Children ) {
Rect childRect = new Rect( currentPosition, child.DesiredSize );
child.Arrange( childRect );
currentPosition.Offset( childRect.Width, childRect.Height );
}
return new Size( currentPosition.X, currentPosition.Y );
}
}
}
using System.Windows.Controls;
using System.Windows;
namespace CustomPanel {
public class DiagonalPanel : Panel {
protected override Size MeasureOverride( Size availableSize ) {
double totalWidth = 0;
double totalHeight = 0;
foreach( UIElement child in Children ) {
child.Measure( new Size( double.PositiveInfinity,
double.PositiveInfinity ) );
Size childSize = child.DesiredSize;
totalWidth += childSize.Width;
totalHeight += childSize.Height;
}
return new Size( totalWidth, totalHeight );
}
protected override Size ArrangeOverride( Size finalSize ) {
Point currentPosition = new Point( );
foreach( UIElement child in Children ) {
Rect childRect = new Rect( currentPosition, child.DesiredSize );
child.Arrange( childRect );
currentPosition.Offset( childRect.Width, childRect.Height );
}
return new Size( currentPosition.X, currentPosition.Y );
}
}
}