WPF: 旋转Thumb后,DragDelta移动距离出错的解决

当Thumb跟随Grid旋转90度后,拖拽控件时会飞掉。

<Grid x:Name="gridMain" Width="100" Height="50" Background="Green" RenderTransformOrigin="0.5,0.5" Canvas.Left="100" Canvas.Top="100"> 
                <Grid.RenderTransform>
                    <RotateTransform x:Name="rotate" Angle="90"></RotateTransform>
                </Grid.RenderTransform>
                <Thumb x:Name="thumbMain" Opacity="0.8" DragDelta="Thumb_DragDelta"></Thumb>
            </Grid>
private void Thumb_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
        {
            Canvas.SetLeft(gridMain, Canvas.GetLeft(gridMain) + e.HorizontalChange);
            Canvas.SetTop(gridMain, Canvas.GetTop(gridMain) + e.VerticalChange);
        }

 

 

这是由于坐标系不统一造成的。Canvas.SeltLeft 和 Canvas.SetTop是用的Canvas坐标系。而Thumb的e.HorizontalChange 和 e.VerticalChange 是根据鼠标相对于Thumb自身坐标系计算出来的, 两个坐标系有个90度的角度差。将e.HorizontalChange 和 e.VerticalChange转换到Canvas的坐标系下,拖拽就没问题了。如下:

private void Thumb_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
        {
            Point ptChange = rotate.Transform(new Point(e.HorizontalChange, e.VerticalChange));
            Canvas.SetLeft(gridMain, Canvas.GetLeft(gridMain) + ptChange.X);
            Canvas.SetTop(gridMain, Canvas.GetTop(gridMain) + ptChange.Y);
        }
posted @   马语者  阅读(1943)  评论(1编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
点击右上角即可分享
微信分享提示