停靠/填充WPF

停靠/填充WPF,wpf,dock,fill,autofill,Wpf,Dock,Fill,Autofill,这似乎是一个很简单的问题,但我已经试了一个小时,似乎无法解决它 我只想用画布填充主窗口。我找不到任何允许这样做的属性,我能想到的唯一方法是设置Canvas.Width/Height=MainWindow.Width/Height,但每次调整窗口大小时我都必须这样做 在WinForms中,将元素停靠在父容器中很容易。只需设置画布即可。和“伸展”。这将导致画布填充包含UI元素的可用空间。只需确保不明确指定宽度/高度 在XAML中,这只是: <Window ...Other window pro

这似乎是一个很简单的问题,但我已经试了一个小时,似乎无法解决它

我只想用画布填充主窗口。我找不到任何允许这样做的属性,我能想到的唯一方法是设置
Canvas.Width/Height=MainWindow.Width/Height
,但每次调整窗口大小时我都必须这样做

在WinForms中,将元素停靠在父容器中很容易。

只需设置画布即可。和“伸展”。这将导致画布填充包含UI元素的可用空间。只需确保不明确指定宽度/高度

在XAML中,这只是:

<Window ...Other window props... >
    <Canvas HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
        <!-- Canvas items here... -->
    </Canvas>
</Window>

用xaml表示画布的宽度和高度

Width="{Binding Path=ActualWidth, ElementName=Window1}"
Height="{Binding Path=ActualHeight, ElementName=Window1}"

当您调整窗口大小时,它应该相应地改变。不过,似乎您必须添加一个
DockPanel

<DockPanel Name="dockPanel1">
    <Canvas Name="canvas1" Background="White"></Canvas>
</DockPanel>

在WPF中,您可以通过将项目放置在DockPanel中并使用Dock继承属性来进行停靠。但是,如果希望整个窗口成为画布,只需使其成为画布,而不是其他类型的面板:

<Window ...>
    <Canvas>
        <!-- blah blah -->
    </Canvas>
</Window>


只需确保您没有在画布上明确设置宽度/高度属性即可。这很有效。我知道我以前试过,但没用,但谁知道呢。谢谢--编辑:我可能将宽度/高度设置为最佳。不依赖于任何其他内容。如果canvas是ItemsControl的ItemsPanelTemplate,则不起作用!有很多方法可以做到这一点。这一个有点过火,但可以很好地工作。提示:不要将自动生成的名称留在控件上。给他们起个有意义的名字。当您不必检查车牌号是否在textBox23或textBox17中时,您会更高兴。更好的是,如果您不需要引用它们,就不要命名它们:在WPF中,名称是可选的。@Martinho,我不知道名称是可选的。那很方便。谢谢。这个怎么样更好?我认为Eric的答案比进行这种绑定更简单/可靠。