在主窗口中定位画布

时间:2013-03-16 16:47:27

标签: wpf canvas

我有以下代码可以动态创建画布:

    public MainWindow()
    {
        InitializeComponent();

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

        this.AddChild(canvas);
        ...
    }

除了Visual Studio生成的样板MainWindow定义之外,相应的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>

代码将画布置于应用程序主窗口的中间。如何通过代码自己定位画布?

2 个答案:

答案 0 :(得分:1)

首先,你应该指明你对“位置”的意思。

您可以指定Canvas的Margin属性,以便它相应于容器(Window)定位。但是,还要考虑Horizo​​ntalAlignment和VerticalAlignment属性,它们与边距一起使用。

也许你的意思是“绝对”的定位。例如,将画布定位在某个点/大小,与容器大小无关。在这种情况下,最简单的方法是将Canvas放在另一个Canvas中,然后通过设置Canvas.Left和Canvas.Top属性来定位内部Canvas。当然你也应该指定宽度和高度。

干杯

答案 1 :(得分:1)

您的Window中通常会有某种顶级容器,也许是另一种Canvas:

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

现在,您可以将Canvas添加到根Canvas:

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,Canvas等,最重要的一点是它们可以嵌套。例如,您可以将Canvas放入网格中,并根据需要将其放入另一个网格中。

然而,顶级面板,无论是Grid还是Canvas等等,都设置为Window的Content属性。在代码中你可以像下面的节目那样做,但几乎没有任何理由这样做。

public MainWindow()
{
    InitializeComponent();

    var rootPanel = ...;
    Content = rootPanel;
}