自定义布局控件
01: using System; 02: using System.Net; 03: using System.Windows; 04: using System.Windows.Controls; 05: using System.Windows.Documents; 06: using System.Windows.Ink; 07: using System.Windows.Input; 08: using System.Windows.Media; 09: using System.Windows.Media.Animation; 10: using System.Windows.Shapes; 11: 12: namespace Demos7 13: { 14: public class CellsPanel:Panel 15: { 16: //重写测量方法 17: protected override Size MeasureOverride(Size availableSize) 18: { 19: int i = 0; 20: foreach (FrameworkElement child in Children) 21: { 22: if (i < 15) 23: { 24: //为前15个可放在这个容器中的元素分配100×100的空间 25: child.Measure(new Size(100, 100)); 26: } 27: else 28: { //15个之后的呢,就不显示了。 29: child.Measure(new Size(0, 0)); 30: } 31: i++; 32: } 33: return new Size(300,600);//总大小 34: } 35: 36: //重写排列方法 37: protected override Size ArrangeOverride(Size finalSize) 38: { 39: UIElementCollection mychildren = Children; //Children 是Panel父类的共有成员 40: int count = mychildren.Count; 41: for (int i = 0; i < count; i++) //遍历每一个成员 42: { 43: Point cellOrigin = GetCellOrigin(i);//计算左上角的位置 44: double dw = mychildren[i].DesiredSize.Width;//宽度值 45: double dh = mychildren[i].DesiredSize.Height;//高度值 46: mychildren[i].Arrange(new Rect(cellOrigin.X, cellOrigin.Y, dw, dh));//排列元素的位置及他的宽度和高度 47: } 48: return new Size(300, 600); 49: } 50: 51: //计算索引为cellIndex的子元素的左上角位置 52: protected Point GetCellOrigin(int cellIndex) 53: { 54: int cellRow, cellColomn; 55: cellColomn = cellIndex % 3; 56: cellRow = cellIndex / 3; 57: 58: int x, y; 59: x = cellColomn * 100; 60: y = cellRow * 100; 61: if (cellColomn == 1) y += 50; 62: 63: Point cellOrigin = new Point(x, y); 64: return cellOrigin; 65: } 66: 67: } 68: }