我需要实现一个Canvas
根据它的大小来缩放它的内容。我知道有Viewbox
,它可以缩放其中的所有内容。但是我不能使用它,因为某些元素具有固定大小并且无法缩放。
另外,如何将 的大小绑定Canvas
到父元素(例如可调整大小的窗口)。windows有sizeToContent,我希望大小正好相反。此外,画布使用一些基于托管元素大小的绘图,如何触发重绘以及如何确保它仅在获得有效(或最小)大小时才绘制?
如果您没有为画布指定任何宽度或高度,它会自动使用所有可用空间。这是因为默认设置VerticalAlignment
为.HorizontalAlignment
Stretch
你所说的画布是什么意思,它根据它的大小来缩放它的内容而不缩放所有的内容,因为有些内容是固定的?
评论后更新
如果您的绘图算法已经将内容缩放到画布的高度和宽度,那么您需要做的就是调整画布大小以适合我认为的区域?在这种情况下,只需删除硬编码的高度/宽度值,画布就会调整大小以适应容器。
在此之后,您可能需要在绘图算法中使用 ActualHeight/ActualWidth 而不是 Height/Width。ActualHeight/ActualWidth 返回布局容器将为您的画布提供的值,因此这些值表示画布所用的值。
我想你可以在我的伦敦地铁演示中找到所有问题的答案。
我是从记忆中做的,但如果我没记错的话,一个窗口使用面板或画布作为它的 ControlTemplate(其中包含 ContentPresenter)的一部分,这意味着直接放置在窗口中的画布将有自动调整大小的问题就像在其他地方一样。有一些基本的方法可以解决这个问题。
1 编写一个新的 ControlTemplate 供您的 Window 使用。:(
2 将您的内容直接放在窗口中,而不是在窗口内的画布中。:/
3 进行名称绑定。:)
<MyWindow x:Name="topWindow">
<Canvas x:Name="topCanvas" Width="{Binding ElementName=topWindow, Path=ActualWidth}" Height="{Binding ElementName=topWindow, Path=ActualHeight}">
...Content...
</Canvas>
</MyWindow>
(碰巧,我经常以这种方式在 Canvases 中绑定网格,因此我可以轻松地为从一个网格位置移动到另一个网格位置的项目设置动画。)