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