Практическое руководство. Создание пользовательского элемента Panel
Обновлен: Ноябрь 2007
Пример
В этом примере демонстрируется переопределение поведения макета по умолчанию для элемента Panel и создание пользовательских элементов макета, производных от Panel.
В этом примере определяется простой пользовательский элемент Panel с именем PlotPanel, который размещает дочерние элементы в соответствии с двумя заданными в коде координатами x и y. В этом примере x и y равны 50; таким образом, все дочерние элементы расположены на одинаковом расстоянии от осей x и y.
Чтобы реализовать поведение пользовательской Panel, в примере используются методы MeasureOverrideArrangeOverride. Каждый метод возвращает данные Size, необходимые для размещения и отображения дочерних элементов.
Public Class PlotPanel
Inherits Panel
'Override the default Measure method of Panel.
Protected Overrides Function MeasureOverride(ByVal availableSize As System.Windows.Size) As System.Windows.Size
Dim childSize As Size = CType(availableSize, Size)
For Each child As UIElement In InternalChildren
child.Measure(childSize)
Next
Return MyBase.MeasureOverride(availableSize)
End Function
Protected Overrides Function ArrangeOverride(ByVal finalSize As System.Windows.Size) As System.Windows.Size
For Each child As UIElement In InternalChildren
Dim x As Double = 50
Dim y As Double = 50
child.Arrange(New Rect(New System.Windows.Point(x, y), child.DesiredSize))
Next
Return MyBase.ArrangeOverride(finalSize)
End Function
End Class
public class PlotPanel : Panel
{
// Default public constructor
public PlotPanel()
: base()
{
}
// Override the default Measure method of Panel
protected override Size MeasureOverride(Size availableSize)
{
Size panelDesiredSize = new Size();
// In our example, we just have one child.
// Report that our panel requires just the size of its only child.
foreach (UIElement child in InternalChildren)
{
child.Measure(availableSize);
panelDesiredSize = child.DesiredSize;
}
return panelDesiredSize ;
}
protected override Size ArrangeOverride(Size finalSize)
{
foreach (UIElement child in InternalChildren)
{
double x = 50;
double y = 50;
child.Arrange(new Rect(new Point(x, y), child.DesiredSize));
}
return finalSize; // Returns the final Arranged size
}
}
Полный пример содержится в разделе Пример создания простой пользовательской панели.
См. также
Задачи
Пример создания пользовательской панели с переносом содержимого