私はあなたが経験していることは、どのようにWPF performs layoutと思い、キャンバスがレイアウトにどのように参加しないのかと思います。
特定のケースでは、矩形の幅をCanvas.ActualWidthに設定していますか?キャンバスの幅/高さが明示的に設定されていないかぎり、ActualWidth/Actualheightはゼロになるため、キャンバスの子を配置する参照ポイントを取得することはできません。私は、キャンバスの幅と高さを親コンテナにバインドする(またはコードで設定する)ことで、ActualWidth/ActualHeightが正しく伝播されるようにします。
この例では、WPFレイアウトエンジンの仕組みを理解しています。次のコードでは、FrameworkElementの高さを強制的に幅、高さを通常通りに設定し、問題の要素に対してレイアウト(測定、配置の調整)を強制します。これにより、WPFレイアウトエンジンは要素を測定/配置し、幅、高さをActualWidth、ActualHeightに伝播します。例えば
:
// Set the width, height you want
element.Width = 123;
element.Height = 456;
// Force measure/arrange
element.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
element.Arrange(new Rect(0, 0, element.DesiredWidth, element.DesiredHeight));
// Subject to sufficient space, the actual width, height will have
// the values propagated from width/height after a measure and arrange call
double width = element.ActualWidth;
double height = element.ActualHeight;
また明確にするためthis related questionを参照してください。私は上記の方法を時々、キャンバス上に正しく配置するためにテキストブロック内のテキストを測定するために使用しました。
もう一度おねがいします。私はまた、画面のサイズ変更のためにどうしても発生する必要がある、私のコントロールのSizeChanged()イベントの後に再描画を開始することによって、別の方法で偶然を見つけました。 – Greg