我有以下代码可以动态创建画布:
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>
代码将画布置于应用程序主窗口的中间。如何通过代码自己定位画布?
答案 0 :(得分:1)
首先,你应该指明你对“位置”的意思。
您可以指定Canvas的Margin属性,以便它相应于容器(Window)定位。但是,还要考虑HorizontalAlignment和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;
}