Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.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
C# WinRT(或WPF)ScaleTransformation如何影响翻译运动?_C#_Wpf_Winrt Xaml_Scaling_Transformation - Fatal编程技术网

C# WinRT(或WPF)ScaleTransformation如何影响翻译运动?

C# WinRT(或WPF)ScaleTransformation如何影响翻译运动?,c#,wpf,winrt-xaml,scaling,transformation,C#,Wpf,Winrt Xaml,Scaling,Transformation,我已经为一个问题挣扎了好几天了。我相信我已经很接近了,但解决办法一直没有找到 我有一个画布,可以动态地在上面放置不同的形状。使用操纵增量事件,我允许用户四处移动形状。在这个事件中,我还获取窗口的边界,并使用它们防止用户将形状拖离屏幕。目前,所有这些都有效 void OnShapeManipulation(object sender, ManipulationDeltaRoutedEventArgs e) { Shape shape = sender as Shape;

我已经为一个问题挣扎了好几天了。我相信我已经很接近了,但解决办法一直没有找到

我有一个画布,可以动态地在上面放置不同的形状。使用操纵增量事件,我允许用户四处移动形状。在这个事件中,我还获取窗口的边界,并使用它们防止用户将形状拖离屏幕。目前,所有这些都有效

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; 
    }
这同样有效,但有一点需要注意。在此纵向模式/缩放画布中,形状只能围绕画布的一部分拖动。在ManufactionDelta上打断显示,形状本身尽管在视觉上进行了缩放,但仍然认为它们是其原始高度和宽度。该形状的坐标也反映了未缩放的画布。例如,一个圆圈会说它的X是1000,即使它在屏幕上是可见的,并且当时最大画布宽度只有786

如何将比例正确应用于我的动作翻译


谢谢

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


你可能也想看看你的边界检查,如果
ActualWidth
ActualHeight
是缩放值还是非缩放值,我想不起来了。

正如你已经预料到的,平移将根据缩放值进行调整。假设你的比例是一致的。这是基本方法:

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;

祝你好运

MVVM是你的朋友。不要为此使用变换。看我的例子
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;