我需要实现一个Canvas
,根据其大小来扩展其内容。我知道有Viewbox
,它可以扩展内部的所有内容。但是我不能使用它,因为一些元素具有固定的大小而且无法缩放。
另外,我如何将Canvas
的大小绑定到父元素(例如可调整大小的窗口)。有窗口的sizeToContent,我希望尺寸恰好相反。此外,画布使用一些基于托管元素大小的绘图,如何触发重绘以及如何确保它只有在获得有效(或最小)大小时才绘制?
答案 0 :(得分:3)
如果没有为画布指定任何宽度或高度,它会自动使用所有可用空间。这是因为默认VerticalAlignment
和HorizontalAlignment
设置为Stretch
。
你是什么意思的画布根据它的大小缩放它的内容而不缩放所有的内容,因为有些具有固定的大小?
评论后更新
如果您的绘图算法已经将内容缩放到画布的高度和宽度,那么您需要做的就是调整画布大小以适应我认为的区域?在这种情况下,只需删除硬编码的高度/宽度值,画布将调整大小以适合容器。
在此之后,您可能需要在绘图算法中使用ActualHeight / ActualWidth而不是Height / Width。 ActualHeight / ActualWidth返回布局容器为画布赋予的值,因此这些值表示绘制画布的值。
答案 1 :(得分:2)
我认为您可以在London Underground demo中找到所有问题的答案。
答案 2 :(得分:0)
我是从内存中做到的,但是如果我没记错的话,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中的网格,因此我可以轻松地动画从一个网格位置移动到另一个网格位置的项目。)