-1

私はカスタム パネルを作成しています。再測定が必要な場合は、親も再測定する必要があることを子供たちに伝える方法を知りたいです。

例として、子供の 1 人が幅を変更し、親も再測定する必要があり、親も再測定を行い、次に彼の親の親と彼の親の親などVisualTree.. それ、どうやったら出来るの?

ここにパネルの測定コードがあります..しかし、親に再測定するように伝える方法

protected override Size MeasureOverride(Size availableSize)
{
 double x;
 double y;
 var children = this.InternalChildren;
 for (int i = 0; i < children.Count; i++)
     {
       UIElement child = children[i];
       child.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity);
       y += child.DesiredSize.Height;
       x = Math.Max(x, child.DesiredSize.Width);
      }
 return new Size(x, y);
}
4

1 に答える 1

1

左上隅に子要素を配置するこの非常に単純なカスタム パネルを見てください。

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

于 2013-02-09T21:49:49.067 に答える