WPF:路径缩放的正确方法是什么?

35
我有一个路径(看起来像个椭圆形):
<Path Data="Bla Bla"/>

现在我想将路径的宽度和高度缩放到我想要的大小。我发现了一种方法:

<Grid Width="400" Height="50">
<Viewbox Stretch="Fill">
    <Path Data="Bla Bla"/>
</Viewbox>  
</Grid>

这个方法可以工作,但我想知道这是否是最有效的方法?(我不得不引入了网格和视口来实现这一点)


1
<Path Stretch="Fill" Data="Bla Bla"/> also works inside <Grid> - Jinjinov
4个回答

35

另一种缩放路径的方法是使用 RenderTransformLayoutTransform

<Path Data="Bla Bla"
      RenderTransformOrigin="0.5, 0.5">
    <Path.RenderTransform>
        <ScaleTransform ScaleX="1.5" ScaleY="1.5"/>
    </Path.RenderTransform>
</Path>

5
通常更喜欢使用“LayoutTransform”,这样当“Path”增长时,它在“Panel”上占用的空间也会相应增加。 - user7116
1
@sixlettervariables:确实如此,除非你想要相反的情况:) 但正如你所说,在大多数情况下,“LayoutTransform”是你想使用的。 - Fredrik Hedblad
1
我也相信LayoutTransform不会影响描边的粗细,而RenderTransform会。 - Mark A. Donohoe

14

顺便提一下,由于ViewBox内部使用了ScaleTransform,因此从性能方面来说它基本上与其他方法一样好。


13

您基本上有三种方法来缩放路径:

  1. 将其包装到ViewBox中
  2. 应用ScaleTransform
  3. 明确设置宽度和高度

方法1和2将产生相同的结果,而3略有不同,因为形状将更改大小,但描边将保持原始厚度(因此它不是真正的缩放)。

当您要填充给定尺寸的区域时,适用于方法1。另一方面,当您需要按给定量放大(或缩小)路径时,例如原始大小的两倍,方法2将很有用。


1
你可以通过编程的方式来完成,例如:http://social.msdn.microsoft.com/Forums/vstudio/en-US/a0d473fe-3235-4725-aa24-1ea9307752d3/how-to-rendertransform-in-code-behind-c?forum=wpf
kUIWEB:kArrow mArrow = new kUIWEB:kArrow(); 
mArrow.Width=30; 
mArrow.Height=30; 
mArrow.RenderTransformOrigin=new Point(0.5, 0.5); 


ScaleTransform myScaleTransform = new ScaleTransform(); 
myScaleTransform.ScaleY = 1; 
myScaleTransform.ScaleX = 1; 

RotateTransform myRotateTransform = new RotateTransform(); 
myRotateTransform.Angle = 0; 

TranslateTransform myTranslate = new TranslateTransform (); 
myTranslate.X = 12; 
myTranslate.X = 15; 

SkewTransform mySkew = new SkewTransform (); 
mySkew.AngleX=0; 
mySkew.AngleY=0; 

// Create a TransformGroup to contain the transforms 
// and add the transforms to it. 
TransformGroup myTransformGroup = new TransformGroup(); 
myTransformGroup.Children.Add(myScaleTransform); 
myTransformGroup.Children.Add(myRotateTransform); 
myTransformGroup.Children.Add(myTranslate); 
myTransformGroup.Children.Add(mySkew); 

// Associate the transforms to the object 
mArrow.RenderTransform = myTransformGroup; 

5
请注意,仅链接回答不被鼓励,SO答案应该是寻找解决方案的终点(而不是引用的另一个中转站,随着时间的推移往往会过时)。请考虑在此处添加一个独立的简介,保留链接作为参考。 - kleopatra

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