左上隅に子要素を配置するこの非常に単純なカスタム パネルを見てください。
public class MyPanel : Panel
{
protected override Size MeasureOverride(Size availableSize)
{
Trace.TraceInformation("MeasureOverride");
var size = new Size();
foreach (UIElement element in InternalChildren)
{
element.Measure(availableSize);
size.Width = Math.Max(size.Width, element.DesiredSize.Width);
size.Height = Math.Max(size.Height, element.DesiredSize.Height);
}
return size;
}
protected override Size ArrangeOverride(Size finalSize)
{
Trace.TraceInformation("ArrangeOverride");
foreach (UIElement element in InternalChildren)
{
element.Arrange(new Rect(element.DesiredSize));
}
return finalSize;
}
}
以下のように Button 子で使用する場合
<local:MyPanel>
<local:MyPanel>
<Button Width="100" Height="100" Click="Button_Click"/>
</local:MyPanel>
</local:MyPanel>
Button のサイズを変更する Button_Click ハンドラ
private void Button_Click(object sender, RoutedEventArgs e)
{
((FrameworkElement)sender).Width += 20;
}
ボタンをクリックするたびに、親と親のパネルが測定され、配置されることがわかります。トレース出力は次のようになります。
CustomPanelTest.vshost.exe Information: 0 : MeasureOverride
CustomPanelTest.vshost.exe Information: 0 : MeasureOverride
CustomPanelTest.vshost.exe Information: 0 : ArrangeOverride
CustomPanelTest.vshost.exe Information: 0 : ArrangeOverride
したがって、親パネルを呼び出しMeasure
たり、手動で操作したりする必要はありません。Arrange