如何在WPF中调整Canvas的大小?

4
我正在编写一个WPF应用程序,其中包含一个Canvas。该Canvas将在运行时进行自定义渲染。它类似于游戏,需要以像素为单位进行测量。我需要将我的Canvas设置为478x478像素(客户端矩形大小)。我不希望在我的Canvas上发生任何缩放或其他与分辨率无关的步骤。
我不确定在WPF中是否可能实现这一点,因为它的性质是分辨率无关的。我的问题如下:
  1. 如何在运行时调整Canvas的大小(调用哪个函数)?
  2. 当我调整Canvas的大小时,可呈现区域(客户端矩形)会变成那个大小吗?如果不是,如何调整大小以确保客户端矩形具有特定的宽度/高度?
  3. 是否可以以像素为单位设置Canvas的宽度/高度?WPF的分辨率无关方面如何干扰我所要做的事情?
  4. 当我调整Canvas的大小时,其他控件是否会适当地调整大小,就像在WPF设计器中设计的那样?
谢谢您的帮助。
3个回答

6

调整大小很简单:

MyCanvas.Width = 350;
MyCanvas.Height  = 450;

这会设置画布的大小,你可以渲染超出这个范围的坐标,但是它会被裁剪。你可以将你的画布放在一个滚动条中,以允许用户查看画布高度/宽度之外的内容。
至于你其他问题的答案,我认为你可以参考这个SO问题

只是为了澄清一下给楼主:这段代码将调整画布的大小,但不会将其设置为350x450像素。WPF不使用像素作为尺寸单位,而是使用英寸的96分之一;这段代码将宽度设置为3.64英寸x 4.68英寸。 - Steve Cooper
我将大小设置为478x478,但我没有注意到任何其他控件相对于画布底部的位置发生变化。也许改变宽度/高度不会强制主窗口重新布局?另外请记住,我在我的Canvas构造函数中设置了Width / Height。希望这不是太早了。 - void.pointer
当您在画布中放置某物时,它的坐标是相对于画布的。它们不会自动移动。您需要循环遍历子集并手动调整。 :( - Muad'Dib

6
任何在画布中定位的元素不会根据画布的大小调整大小或重新定位。因此,我认为设置画布的大小没有任何优势。也许你应该只是设置窗口的固定大小。
否则,只需设置Canvas.Width、Height和ClipToBounds=True,您就可以拥有一个固定大小的画布,它使用X/Y坐标定位其子元素。
另外,您应该确保在画布上设置SnapsToDevicePixels=True,以便子元素具有清晰的像素对齐边界。

如果您需要内部元素适应画布的约束条件,那么画布可能不是要使用的东西。手动设置尺寸的网格会更好。 - Steve Wortham
有点老了,使用一个包装Canvas的Viewbox。 - glihm

4
更新2020:关于WPF .NET CORE:如果CanvasViewbox的子级,则内容将自动缩放到Viewbox的高度和宽度。
  <Viewbox Stretch="Fill"
           Width="50"
           Height="50">

     <Canvas>
       <Path.... />
     </Canvas>

  </Viewbox>

哇塞...就像一个魔法盒子! :) - Christian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接