2012-01-20 96 views
2

我正嘗試在WPF中創建一個自定義用戶控件。我希望能夠在以後在另一個窗口中使用該控件時手動設置大小。InitializeComponent()上的自定義控件大小

作爲一個簡短的測試,我剛剛做了一個包含網格內的畫布的控件,它完全填充了控件。初始化時,它會在其內部繪製一個顯示其大小的矩形。然後,我把它放在一個窗口上,使它成爲我想要的任何尺寸。

但是我現在有問題,因爲如果我做了矩形的高度我畫

this.ActualHeight 

那麼當初始化這個值的控制仍然是0,所以我什麼也沒得到。相反,如果我用

this.Height 

然後,我感到我在設計時做了它的高度,而不是大小我後來的時間範圍內完成它。

高度和寬度似乎是在XAML設計器中設置的,所以我不知道該怎麼做。

有沒有簡單的方法呢?

回答

1

我想你正在經歷的是如何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爲了清楚起見。我偶爾使用上述方法來測量文本塊中的文本,以便在畫布上正確定位。

+1

再次感謝。我還發現另一種意外的方式,那就是通過在我的控件上的SizeChanged()事件之後啓動重新繪製,而我仍然需要爲調整屏幕大小而發生這種情況。 – Greg