0

次の XAML があります。

   <Grid>
        <StackPanel>
            <local:MyControl Background="Blue" AnotherControl="{x:Reference anotherControl}"/>
            <local:MyAnotherControl Background="Red" x:Name="anotherControl"/>
        </StackPanel>
    </Grid>

問題は、MyControl の MeasureOverride で (100, 20) を返す場合です。MyControl の ArrangeOverride で、受け取った最終サイズを返すと考えました。したがって、MyControl には Window と同じ ActualWidth があります。

ここまでは順調ですが、MyControl の ArrangeOverride 内にいて、サイズを返す前に、MyAnotherControl の測定値を無効にします。

最終結果は、MyAnotherControl が測定されていることですが、パスの配置中に、MyAnotherControl の目的のサイズが変更されたことを StackPanel に通知しません。さらにその結果、StackPanel が正しく表示されません。

アレンジパス中にコントロールを無効にすると、wpf で奇妙な動作が見つかったようです。MyAnotherControl は、サイズの変更について Stackpanel である親に通知していませんが、通知する必要があります。

これに対する解決策はありますか?

ウィンドウのサイズを変更すると、すべてが正しく配置され、描画されます。なんで?

2本のストライプがあります。青いものと赤いもの。赤は別の高さで表示されますが、表示されません。ウィンドウのサイズを変更して強制的に再測定すると、機能します。なぜこの奇妙な動作が起こっているのですか?

public class MyControl : Button
{
    public MyAnotherControl AnotherControl
    {
        get;
        set;
    }

    protected override Size MeasureOverride(Size constraint)
    {
        base.MeasureOverride(constraint);
        return new Size(100, 20);
    }

    protected override Size ArrangeOverride(Size arrangeBounds)
    {
        base.ArrangeOverride(arrangeBounds);
        AnotherControl.MyHeight = 50;
        AnotherControl.InvalidateMeasure();
        return arrangeBounds;
    }
}

public class MyAnotherControl : Button
{
    public double MyHeight
    {
        get;
        set;
    }

    protected override Size MeasureOverride(Size constraint)
    {
        base.MeasureOverride(constraint);
        return new Size(100, this.MyHeight > 0 ? this.MyHeight : 10);
    }

    protected override Size ArrangeOverride(Size arrangeBounds)
    {
        base.ArrangeOverride(arrangeBounds);
        return arrangeBounds;
    }
}
4

1 に答える 1

2

これがwpfの仕組みです。stackpanel は、その子を列挙し、そのアレンジ内でアレンジを呼び出すだけです。測定値が無効な要素で Arrange を呼び出すと、最後に使用可能なサイズで再測定されます。親の onchilddesiredsizechanged は呼び出されないため、親のメジャーは無効になりません。おそらく、兄弟の視覚的な親を取得し、そのメジャーを無効にする必要があります。

于 2013-10-17T01:03:42.107 に答える