我想你正在經歷的是如何WPF performs layout和具體如何畫布不參與佈局。
在您的具體情況下,您將矩形的寬度設置爲Canvas.ActualWidth?除非畫布的寬度/高度已明確設置,否則ActualWidth/Actualheight將爲零,因此您無法獲取用於放置Canvas子項的參考點。我要做的是將畫布寬度和高度綁定到其父容器(或在代碼中設置)以正確傳播ActualWidth/ActualHeight。
作爲一個興趣點試試這個例子來了解WPF佈局引擎是如何工作的。以下代碼可以強制FrameworkElement上的高度將Width,Height設置爲正常,然後對有問題的元素強制佈局(度量,排列傳遞)。這會導致WPF佈局引擎測量/排列元素並將Width,Height傳播到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