2009-11-02 106 views
1

我有一個網格代表一些數據,我需要一個畫布覆蓋它的頂部來佈局一些線條。畫布是它自己的usercontrolWPF和畫布覆蓋

問題是,當網格調整寬度和高度時,畫布及其內容應自動調整大小。

我在一個viewbox中添加了畫布,但它沒有做到這一點。當網格調整大小時,畫布不會。畫布的目的是在網格頂部疊加類似標尺的功能。

我無法使用網格上的樣式替換畫布,因爲網格顯示的畫布信息不同。把它看成是圖,其中可以有不同大小的條列(在我的情況下,網格)和天都在覆蓋線(就像甘特圖)

我的代碼:

taxCanvas = new TimeAxis(); 
Grid.SetRowSpan(taxCanvas, GRightMain.RowDefinitions.Count); 
Grid.SetColumnSpan(taxCanvas, GRightMain.ColumnDefinitions.Count); 
Grid.SetColumn(taxCanvas, 0); Grid.SetRow(taxCanvas, 0); 
Grid.SetZIndex(taxCanvas, -1); 
taxCanvas.Height = GRight.ActualHeight; 
taxCanvas.Width = GRight.ActualWidth; 
GRightMain.Children.Add(taxCanvas); 

TimeAxis是我的畫布用戶控件,GRightMain是一個網格,它將我的畫布和網格與內容(Gright)放在同一行和列中。

回答

0

您的GRightMail控件是一個網格,默認情況下它會伸展它的內容。如果您的數據和TimeAxis控件都位於同一個網格單元格中(並且相同的行/列跨度),它們應該一起拉伸。

如果仍然不是這種情況,請檢查您的TimeAxis是否沒有固定的寬度或高度,或者是否定義了水平/垂直對齊。

1

你的問題的直接原因是線路:

taxCanvas.Height = GRight.ActualHeight; 
taxCanvas.Width = GRight.ActualWidth; 

這將設置一個固定大小的TimeAxis控制,禁用任何自動調整大小。

假設您的TimeAxis用戶控件沒有任何影響度量的內部設置,請使用以下代碼替換高度和寬度設置,這會導致您的UserControl自動調整大小。

taxCanvas.HorizontalAlignment = HorizontalAlignment.Stretch; 
taxCanvas.VerticalAlignment = VerticalAlignment.Stretch; 

然而,這可能並不能完全解決您的問題;您的UserControl所需的大小和佈局大小將與網格的相同,但您仍然需要手動調整畫布上的對象大小。畫布沒有任何措施/安排的規定,所以你必須用代碼處理這個。常見的技巧有:

  1. 在您已經嘗試過的ViewBox內包裝Canvas。您可能會再次嘗試更改上述行。
  2. 使用代碼或綁定調整畫布的的RenderTransform(比調整LayoutTransform更高效,畫布不參與佈局反正)
  3. 使用代碼或綁定調整個別形狀位置

有一個問題,以注意:當您調整畫布大小時,內容不受影響。所以如果你想知道你的畫布是否真的被調整大小,給它一個背景顏色。這樣你就不會浪費時間在錯誤的地方尋找尺寸問題。