WPF: правильный способ масштабирования пути?
У меня есть путь (выглядит как овал):
<Path Data="Bla Bla"/>
Теперь я хочу масштабировать ширину и высоту пути к тому, что мне нравится. Я нашел способ:
<Grid Width="400" Height="50">
<Viewbox Stretch="Fill">
<Path Data="Bla Bla"/>
</Viewbox>
</Grid>
И это работает, но мне интересно, если это самый эффективный способ сделать это? (Я должен был ввести сетку и окно просмотра для этого)
Ответы
Ответ 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;