WPF中复用SVG转Canvas资源时ViewBox缩放的尺寸指定疑问
问题
我正尝试将可复用的SVG图像导入WPF中。我通过合并字典引用了一个外部XAML文件,该文件包含由SVG转换而来的Canvas,结构如下:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Canvas x:Key="myImage" Name="myImage" Width="110" Height="35"> <Canvas.RenderTransform> <TranslateTransform X="0" Y="0"/> </Canvas.RenderTransform> <Canvas.Resources/> <Canvas Name="layer1"> <Canvas.RenderTransform> <TranslateTransform X="-51.393708" Y="-16.078911"/> </Canvas.RenderTransform> <Ellipse...
注意此处已指定Canvas的宽高。
为了在窗口中显示该图像,我在窗口资源中添加了如下配置:
<ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="XamlResources/myImage.xaml"/> </ResourceDictionary.MergedDictionaries> ... <Viewbox Width="200" Stretch="Uniform" HorizontalAlignment="Left"> <Canvas Width="110" Height="35"> <StaticResource ResourceKey="myImage"/> </Canvas> </Viewbox>
注意此处再次指定了Canvas的宽高。
我的疑问是:为何必须在资源和窗口控件中都指定Canvas的尺寸(110x35)?如果移除窗口中Canvas的尺寸设置,图像就会消失。我在导入可复用SVG图像到WPF的操作中是否存在根本性错误?
解答
重复指定尺寸的原因
核心问题出在Canvas的布局特性上:Canvas本身不会自动根据子元素大小调整自身尺寸,默认宽高都是0。当你把带尺寸的myImage(Canvas)放进一个未设置尺寸的外层Canvas时,外层Canvas因为没有显式尺寸,会收缩到0x0的大小,哪怕内部的myImage有尺寸,也没有可见的显示区域,所以图像就消失了。
是否存在根本性错误?
没有根本性错误,但你的布局嵌套有冗余,完全可以简化。
优化实现
直接将资源中的Canvas放到Viewbox里,不需要额外嵌套一层Canvas:
<Viewbox Width="200" Stretch="Uniform" HorizontalAlignment="Left"> <StaticResource ResourceKey="myImage"/> </Viewbox>
Viewbox会自动识别myImage自身的110x35尺寸,然后按照Uniform模式缩放到Viewbox的200宽度,完全不需要重复设置尺寸。
另外,长期来看,建议你用支持输出Path或DrawingImage的SVG转XAML工具。这类元素的布局行为更适配WPF的自动布局系统,不需要手动维护固定尺寸,复用性会更强。
内容的提问来源于stack exchange,提问作者Geoff
相关产品推荐
相关产品推荐

