1

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

    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>

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

4

2 回答 2

3

您通常会在 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);

关于Grid、Canvas 等WPF 面板,最重要的一点可能是它们可以嵌套。例如,您可以将 Canvas 放入 Grid 中,然后将其放入另一个 Grid 中,只要您喜欢就可以。

然而,顶级面板,无论是网格还是画布或其他任何东西,都设置为Content窗口的属性。在代码中你可以像下面显示的那样做,但几乎没有任何理由这样做。

public MainWindow()
{
    InitializeComponent();

    var rootPanel = ...;
    Content = rootPanel;
}
于 2013-03-16T17:15:18.090 回答
1

首先,您应该指定“位置”的含义。

您可以指定 Canvas 的 Margin 属性,以便将其定位到容器(窗口)。但是,还要考虑与 Margin 一起使用的 Horizo​​ntalAlignment 和 VerticalAlignment 属性。

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

干杯

于 2013-03-16T17:15:06.287 回答