silverlight 自定义布局容器
Silverlight中所谓的布局容器,其实都是继承自Panel类,然后重写两个方法:
MeasureOverride:计算元素应该渲染的尺寸
ArrangeOverride:在具体的位置渲染元素
demo:
using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Threading;
namespace LayoutDemo
{
public class TestPanel2 : Panel
{
public TestPanel2() { }
protected override Size MeasureOverride(Size availableSize)
{
foreach (UIElement element in base.Children)
{
element.Measure(availableSize);
}
return base.MeasureOverride(availableSize);
}
protected override Size ArrangeOverride(Size finalSize)
{
switch (this.ori)
{
case Orientation.Horizontal:
{
double num = finalSize.Height;
foreach (UIElement element in base.Children)
{
num -= element.DesiredSize.Height;
element.Arrange(new Rect(0.0, num, finalSize.Width, element.DesiredSize.Height));
}
break;
}
case Orientation.Vertical:
{
double num2 = finalSize.Width;
foreach (UIElement element in base.Children)
{
num2 -= element.DesiredSize.Width;
element.Arrange(new Rect(num2, 0.0, element.DesiredSize.Width, finalSize.Height));
}
break;
}
}
return base.ArrangeOverride(finalSize);
}
protected static void OnLayoutChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
{
TestPanel2 base2 = sender as TestPanel2;
if (base2 != null)
{
base2.RefleshUpdate();
}
}
public void RefleshUpdate()
{
double num = base.ActualWidth.Equals(double.NaN) ? base.DesiredSize.Width : base.ActualWidth;
double num2 = base.ActualHeight.Equals(double.NaN) ? base.DesiredSize.Height : base.ActualHeight;
this.ArrangeOverride(new Size(num, num2));
}
public Orientation ori
{
get { return (Orientation)GetValue(oriProperty); }
set { SetValue(oriProperty, value); }
}
public static readonly DependencyProperty oriProperty =
DependencyProperty.Register("ori", typeof(Orientation), typeof(TestPanel), new PropertyMetadata(Orientation.Horizontal, OnValueChaged));
private static void OnValueChaged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
TestPanel2 panel = sender as TestPanel2;
if (panel != null)
{
panel.RefleshUpdate();
}
}
}
}
浙公网安备 33010602011771号