Подтвердить что ты не робот

WPF: правильный способ масштабирования пути?

У меня есть путь (выглядит как овал):

<Path Data="Bla Bla"/>

Теперь я хочу масштабировать ширину и высоту пути к тому, что мне нравится. Я нашел способ:

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

И это работает, но мне интересно, если это самый эффективный способ сделать это? (Я должен был ввести сетку и окно просмотра для этого)

4b9b3361

Ответ 1

Другой способ масштабирования пути - использовать RenderTransform или LayoutTransform

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

Ответ 2

просто FYI, так как ViewBox использует ScaleTransform внутри него, он в основном так же хорош по производительности.

Ответ 3

У вас есть 3 способа масштабирования пути:

  • Оберните его в ViewBox
  • Применить ScaleTransform
  • Явно установить ширину и высоту

Метод 1. и 2. даст тот же результат, в то время как 3. немного отличается, потому что форма изменит размер, но штрих сохранит исходную толщину (так что это не очень зум).

Метод 1. был бы уместным, если у вас есть область заданного размера, которую вы хотите заполнить. С другой стороны, метод 2. будет полезен для увеличения (или уменьшения) пути на заданную величину, например. в два раза первоначальный размер.

Ответ 4

Вы можете сделать это программно, например 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;