2013-03-16 26 views
0

我已經創建的飛行畫布下面的代碼:定位在主窗口中畫布

public MainWindow() 
    { 
     InitializeComponent(); 

     Canvas canvas = new Canvas(); 
     canvas.Height = 300; 
     canvas.Width = 275; 
     canvas.Background = Brushes.Blue; 

     this.AddChild(canvas); 
     ... 
    } 

沒有什麼,除了由Visual Studio生成的樣板主窗口定義相應的XAML(我已刪除VS默認提供的Grid條目):

<Window x:Class="canvas2.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525" Background="Gray"> 
</Window> 

代碼將畫布居中在應用程序主窗口中間。如何通過代碼自己定位畫布?

回答

1

你通常會具有某種頂層容器在你的窗口,也許是另一種帆布:

<Window ...> 
    <Canvas Name="root"/> 
</Window> 

現在你將你的畫布添加到根畫布:

Canvas canvas = new Canvas(); 
canvas.Height = 300; 
canvas.Width = 275; 
canvas.Background = Brushes.Blue; 

// set child canvas position 
Canvas.SetLeft(canvas, ...); 
Canvas.SetTop(canvas, ...); 

// add child canvas to root 
root.Children.Add(canvas); 

也許最重要的是要知道關於WPF Panels像Grid,C anvas等是他們可以嵌套。例如,您可以將Canvas放入網格中,並將其放入另一個網格中,只要您喜歡即可。

然而,頂層面板,無論是網格還是畫布或其他,都設置爲窗口的Content屬性。在代碼中,你可以做到如下所示,但幾乎沒有任何理由這麼做。

public MainWindow() 
{ 
    InitializeComponent(); 

    var rootPanel = ...; 
    Content = rootPanel; 
} 
+0

謝謝,我不知道你必須擁有頂級容器。這個關鍵點幾乎解決了一切。還有一個問題:根是一個WPF概念,還是最高級別的畫布,它被命名爲root [即Canvas root = new Canvas()]。再次感謝。 – Sabuncu 2013-03-16 17:42:41

+1

「root」只是我在XAML中分配給頂層Canvas的名稱:''。重要的是,頂級容器是窗口的「內容」,只需將它放在''和''之間即可在XAML中完成。你當然可以使用你喜歡的任何其他名字。如果你不喜歡給它一個名字,你也可以像這樣在代碼中檢索它:'var topLevelContainer = Content as Panel;' – Clemens 2013-03-16 17:52:37

+0

謝謝!我需要研究WPF中的「內容」概念。 – Sabuncu 2013-03-16 17:54:45

1

首先,您應該指定「位置」的含義。

您可以指定畫布的邊距屬性,以便它相應地定位到容器(窗口)。但是,請考慮Horizo​​ntalAlignment和VerticalAlignment屬性,它們與保證金一起使用。

也許你的意思是「絕對」定位。例如,將畫布放置在某個點/大小,與容器大小無關。在這種情況下,最簡單的方法是將Canvas放置在另一個Canvas中,然後通過設置Canvas.Left和Canvas.Top屬性來定位內部Canvas。當然,你也應該指定寬度和高度。

乾杯

+0

感謝@Mario Vernari,您的解決方案(「將帆布放置在另一個帆布內」)有助於確認Clemens的解決方案。再次感謝。 – Sabuncu 2013-03-16 17:44:32