在WPF中缩放矢量图像

3

假设我们有以下由两条路径组成的矢量图像:

<Path Data="M 0 0 L 4 0 L 4 8 L 0 8 Z" Fill="Black" />
<Path Data="M 4 0 L 8 0 L 8 8 L 4 8 Z" Fill="Black" />

最重要的事实是,这个图像应该是16x16单位大小(尽管实际图像只覆盖了8x8的正方形区域)。

我希望这个图像可以按照所需的大小进行缩放 - 例如,我想在32x32的位置放置它(然后,绘制的正方形应该是16x16的大小)。我该怎么做?

更难的部分是,我希望这个图像驻留在资源中。可以通过以下方式解决:

<Canvas Width="16" Height="16" x:Key="MyImage">
    <Path Data="M 0 0 L 4 0 L 4 8 L 0 8 Z" Fill="Black" />
    <Path Data="M 4 0 L 8 0 L 8 8 L 4 8 Z" Fill="Black" />
</Canvas>

(...)

<ContentPresenter Content="{DynamicResource MyImage}" />

但这并不能解决缩放的问题。如果可能的话,我希望有一种不需要使用各种Transform的解决方案。


你不想使用转换的特定原因吗?那似乎是最合理的解决方案。 - Kendall Frey
通常图像作为矢量图的整个意义在于,我不必为了图像缩放而应用变换。我只需要将其放入所需大小的容器中,然后观察它的良好缩放即可 :) 但如果没有其他方法,我想我会使用变换... - Spook
2个回答

3

如果您希望它可以自适应任何大小,请将其放置在具有Stretch="Fill"属性的Viewbox中。

<Viewbox Stretch="Fill" x:Key="MyImage">
    <Canvas Width="16" Height="16">
        <Path Data="M 0 0 L 4 0 L 4 8 L 0 8 Z" Fill="Black" />
        <Path Data="M 4 0 L 8 0 L 8 8 L 4 8 Z" Fill="Black" />
    </Canvas>
</Viewbox>

这将把内容拉伸到Viewbox的大小。
如果您想要不同的拉伸行为:System.Windows.Media.Stretch

KaXaml 报告:DynamicResourceExtension 无法设置在类型为 Viewbox 的 Child 属性上。DynamicResourceExtension 只能设置在 DependencyObject 的 DependencyProperty 上。 - Spook
很遗憾,因为图像是根据主题选择的。当主题更改时,将加载另一个ResourceDictionary以使用其他图像。 - Spook
尝试将Viewbox本身与内容内联放置在资源中,然后在图像所在的位置引用它。 - Kendall Frey

1
我相信你对WPF中的矢量图形可能有误解。虽然WPF利用矢量图形可以平滑缩放这些图形,但应注意它们不会自动缩放。因此,您在Path对象中有 一系列说明如何使用图形原语重新创建图像的指令,但它没有调整大小的能力。对于调整大小的任务,您有两个选择:使用ScaleTransform或使用ViewBox(来自MSDN上的链接页面)。
<Path Data="M10,100 C 60,0 100,200 150,100 z" 
    Fill="{StaticResource linearGradientBackground}"
    Stroke="Black"
    StrokeThickness="2">
    <Path.RenderTransform>
        <ScaleTransform ScaleX="3.0" ScaleY="3.0" />
    </Path.RenderTransform>
</Path>

...

<ViewBox Stretch="Uniform">
    <Path Data="M10,100 C 60,0 100,200 150,100 z" 
        Fill="{StaticResource linearGradientBackground}"
        Stroke="Black"
        StrokeThickness="2">
    </Path>
</ViewBox>

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