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;