Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF:旋转矩形并将其放置在画布中_Wpf - Fatal编程技术网

WPF:旋转矩形并将其放置在画布中

WPF:旋转矩形并将其放置在画布中,wpf,Wpf,我有一个问题,旋转一个矩形,并把它在画布上以某种方式。以下是我试图实现的目标: 图中的大矩形是我的画布。较小的矩形是我要旋转的矩形。当我旋转矩形(虚线矩形)时,它当然会被剪裁。为了避免这种情况,我想重新定位矩形,如右图所示 到目前为止,我就是这样尝试的: Rectangle rect = new Rectangle(); rect.Width = 100; rect.Height = 50; int angle = 30; rect.RenderTransform = new RotateTr

我有一个问题,旋转一个矩形,并把它在画布上以某种方式。以下是我试图实现的目标:

图中的大矩形是我的画布。较小的矩形是我要旋转的矩形。当我旋转矩形(虚线矩形)时,它当然会被剪裁。为了避免这种情况,我想重新定位矩形,如右图所示

到目前为止,我就是这样尝试的:

Rectangle rect = new Rectangle();
rect.Width = 100;
rect.Height = 50;
int angle = 30;
rect.RenderTransform = new RotateTransform(angle, rect.Width/2, rect.Height/2);
canvas.Children.Add(rect);

double x = Math.Cos(30) * (rect.Width / 2) + Math.Sin(30) * (rect.Height / 2) - rect.Width / 2;
double y = Math.Sin(30) * (-rect.Width / 2) + Math.Cos(30) * (rect.Height / 2) - rect.Height / 2;
Canvas.SetLeft(rect, x);
Canvas.SetTop(rect, y);
我认为最好的方法是计算x和y偏移量,并通过
Canvas.SetLeft
Canvas.SetTop
定位矩形。但是我不知道怎么做数学题。(y计算似乎有效)

实际上,我想在画布上随机放置几个矩形。旋转角度可以是-45到45度之间的值,矩形大小也可以是随机值。但是矩形应该在画布中始终完全可见,所以我需要知道位置坐标边界的偏移量。(矩形可以相互重叠。)


我希望你能理解我的问题。如果你能帮我,那就太好了。

这个解决方案实际上比你想象的要简单得多。不要使用
RenderTransform
,而是使用
layoututtransform
。它接受相同类型的变换,但在渲染过程中,它不会将它们应用于元素的渲染输出,而是在布局过程中更改元素的布局空间。下面的XAML生成了屏幕截图第二个示例中显示的结果

<Canvas Width="640" Height="480">
    <Rectangle Fill="Blue" Width="200" Height="80">
        <Rectangle.LayoutTransform>
            <RotateTransform Angle="-45"/>
        </Rectangle.LayoutTransform>
    </Rectangle>
</Canvas>


请注意,这在Silverlight中不起作用,因为Silverlight不支持LayoutTransform。

Aw,伙计。既然你能把事情复杂化,为什么还要把它简单化呢这真的很简单。谢谢,伙计!谢谢如果此答案解决了您的问题,您可以通过单击复选标记将其标记为已回答。您的行“rect.Width/2,rect.Height/2);”解决了我的问题。我正在传递intellisense中提到的矩形中心的坐标。奇怪的是,智能感知导致了困惑和疑问的答案。:-)