WinRT(或WPF)ScaleTransformation如何影响平移运动

本文关键字:影响 运动 WPF ScaleTransformation WinRT 何影响 | 更新日期: 2023-09-27 18:28:34

我已经为一个问题挣扎了好几天了。我相信我已经接近了,但解决方案一直在躲避我

我有一个画布,可以动态放置不同的形状。使用ManipulationDelta事件,我允许用户移动形状。在这个事件中,我还获得了窗口的边界,并使用它们来防止用户将形状拖离屏幕。所有这些目前都有效。

void OnShapeManipulation(object sender, ManipulationDeltaRoutedEventArgs e)
    {
        Shape shape = sender as Shape; 
        CompositeTransform tt = shape.RenderTransform as CompositeTransform;
        tt.TranslateX += e.Delta.Translation.X;
        tt.TranslateY += e.Delta.Translation.Y;   
        double top = Window.Current.Bounds.Top;
        double bottom = Window.Current.Bounds.Bottom ;
        double right = Window.Current.Bounds.Right ;
        double left = Window.Current.Bounds.Left ;
        if (tt.TranslateY < top)
            tt.TranslateY = top;
        if (tt.TranslateY > (bottom - shape.ActualHeight))
            tt.TranslateY = bottom - shape.ActualHeight;
        if (tt.TranslateX > (right - shape.ActualWidth))
            tt.TranslateX = right - shape.ActualWidth;
        if (tt.TranslateX < left)
            tt.TranslateX = left; 
    }

问题是,当平板电脑旋转时,我会缩放画布,如图所示。

void MainCanvas_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        double actualWidth = this.MainCanvas.ActualWidth / 1366;
        double actualHeight = this.MainCanvas.ActualHeight / 768;
        double min = Math.Min(actualWidth, actualHeight);
        if (!this.istransformed && min == 1)
            return;
        this.istransformed = true;
        var transform = MainCanvas.RenderTransform as CompositeTransform;
        transform.ScaleX = min;
        transform.ScaleY = min;
        transform.CenterX = this.ActualWidth / 2;
        transform.CenterY = this.ActualHeight / 2;  
    }

这同样有效,但有一点需要注意。在这种肖像模式/缩放画布中,形状只能在画布的一部分周围拖动。对ManipulationDelta的打断显示,尽管在视觉上进行了缩放,但形状本身仍然相信它们是原始的"高度"answers"宽度"。该形状的坐标也反映了未缩放的画布。例如,Circle会说它的X是1000,尽管它在屏幕上是可见的,并且当时画布的最大宽度只有786。

如何将刻度正确应用于动作翻译?

感谢

WinRT(或WPF)ScaleTransformation如何影响平移运动

正如您已经预料到的,翻译将根据比例进行调整。假设你的体重秤是统一的。这是基本方法:

scale = 1;
distance = 500;
transform.ScaleX = transform.ScaleY = scale;
// actually moves 500
transform.TranslateX = distance / scale;
scale = 2;
distance = 500;
transform.ScaleX = transform.ScaleY = scale;
// actually moves 250
transform.TranslateX = distance / scale;

祝你好运!

您需要按当前比例因子的倒数缩放e.Delta.Translation.Xe.Delta.Translation.Y。在按比例缩小的视图中拖动(20,40)实际上是形状使用的坐标空间中的较大移动,即(40,80)。

你可能还想看看你的边界检查,我想不起来ActualWidthActualHeight是否是缩放值。