我有一个自定义构建的控件,它是一个矩形,里面有一些细节,但它是一个矩形。
我有一个中心点(X,Y),我称之为"重心",它"代表"该点。这意味着当我为对象设置新位置时,我希望该点位于设置的位置。当我旋转对象时,我需要它围绕这一点旋转。当我缩放对象时,该点必须保持在之前设置的位置。只有对象的大小必须更改。
例如,为了简单了解问题,假设我有一个 10X10 的正方形。我将重心设置在正方形的正中心:(5,5)。然后我将对象位置设置为 (100, 100)。然后,正方形将在:
(95,95),(105,95),(105,105),(95,105),这意味着其中心将处于所需位置。
如果我用值 2 缩放正方形,新的 4 点位置将是:
(90,90),(110,90),(110,110),(90,110),这意味着其中心将保持在所需位置。
如果我将它旋转 45 度,它会围绕其中心旋转位置:
(92.93,92.93),(107.07,92.93),(107.07,107.07),(92.93,107.07)
如何做到这一点,其中心完全可配置,并且所有这些转换对于 WPF 中的程序都是透明的?我只想设置比例,位置,旋转角度和中心以正确绘制。
谢谢!
您可以设置变换相对于对象大小的中心点。如果要围绕对象的左上角旋转,则值将为 0, 0
。要围绕右下角 10% 的位置旋转,您可以使用 1.1, 1.1
.
该属性称为 RotationTranforms 的RenderTransformOrigin
。在 Blend 中,属性中有一个"转换"组。如果展开它,渲染变换将具有一组选项卡。第五个是中心点。
下面是一些示例 XAML:
<TextBlock Text="TextBlock" RenderTransformOrigin="-0.5,-0.5" Background="#FFA1BBF9" Margin="50" Width="100" Height="100">
<TextBlock.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="2"/>
<SkewTransform/>
<RotateTransform Angle="30"/>
<TranslateTransform/>
</TransformGroup>
</TextBlock.RenderTransform>
</TextBlock>
** 旋转原点上的任何控件**
// rotated object
Rectangle r = new Rectangle();
r.Fill = Brushes.Blue;
r.Stroke = Brushes.Yellow;
r.Width = 200;
r.Height = 100;
//rotate transform
RotateTransform rt = new RotateTransform();
r.RenderTransform = rt;
//origin for object
r.RenderTransformOrigin = new Point(.5,.5);
DoubleAnimation anim3 = new DoubleAnimation(0, 360, TimeSpan.FromSeconds(.5));
anim3.RepeatBehavior = RepeatBehavior.Forever;
rt.BeginAnimation(RotateTransform.AngleProperty, anim3);
grid1.Children.Add(r);