2015-10-15 131 views
1

hello我有以下問題:我想用方法Canvas.SetLeft()和Canvas.SetTop()在畫布上繪製一個矩形。當更改網格的寬度時更新矩形的寬度

我使用的方法UserControl_Loaded()和一切正常。 問題是,在調整窗口大小並因此改變網格的大小時,ActualWidth值不會改變,而且我的值不再準確。

 private void UserControl_Loaded(object sender, RoutedEventArgs e) 
    { 
     Rectangle rett = new Rectangle(); 
     rett.Height = grid1.ActualHeight-10; 
     rett.Width = grid1.ActualWidth -10; 
     rett.Fill = new SolidColorBrush(Colors.LightBlue); 
     canv.Children.Add(rett); 
     Canvas.SetLeft(rett, 10); 
     Canvas.SetTop(rett, 10); 
    } 

這是XAML:

<Grid x:Name="grid1"> 
     <Canvas x:Name="canv" Height="auto" Width="auto"></Canvas> 
</Grid> 

中的第一張照片是罰款時,不調整窗口的大小。

OK

第二時我調整網格保持先前的寬度。

NO

我想改變格柵的寬度時,矩形的寬度進行了更新。 謝謝。

回答

0

如果沒有a good, minimal, complete code example,它清楚地說明了你的問題,並且詳細解釋了你實際嘗試完成的內容(特別是從更廣泛的意義上說),不可能知道你的情況下最好的答案是什麼。

考慮您的問題從字面上看,似乎一個可能的方法是將Rectangle尺寸綁定到Grid的尺寸,使它們可作爲Grid改變大小更新。您可以使用IValueConverter從實際尺寸中減去適當的金額。

但是,這是一個相當複雜的解決方案,否則將是一個相當簡單的問題,特別是如果你出於某種原因似乎是在代碼隱藏中做這件事(首先不理想,並設置綁定在代碼隱藏中是特別乏味的)。

慣用,你應該可能做不把RectangleCanvas所有,而是使其成爲Grid直接的一個孩子。然後,您可以將其路線設置爲Stretch,以便填充它所在的網格單元格。最後,可以設置其邊距,以便在頂部和左側有10個像素的間隙,而在右側和底部沒有間隙。

例如:

private void UserControl_Loaded(object sender, RoutedEventArgs e) 
{ 
    Rectangle rett = new Rectangle(); 
    rett.Fill = new SolidColorBrush(Colors.LightBlue); 

    // NOTE: technically don't need to set these, as Stretch is the default value! 
    rett.HorizontalAlignment = HorizontalAlignment.Stretch; 
    rett.VerticalAlignment = VerticalAlignment .Stretch; 

    // 10 pixels of margin on top and left, none on right and bottom 
    rett.Margin = new Thickness(10, 10, 0, 0); 

    grid1.Children.Add(rett); 
} 

否則它上面的允許XAML佈局引擎來自動處理您正在尋找的大小調整行爲。

所有這一切,我一定會鼓勵你在XAML而不是代碼隱藏中實現這一點。有許多代碼隱藏的優點,但坦率地說,XAML在與GUI對象圖的配置直接相關的任何事情上都要好得多。