次の 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;
}
}