我已经为一个问题苦苦挣扎了好几天了。我相信我很接近,但解决方案一直在逃避我。
我有一个画布,可以在上面动态放置不同的形状。使用 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 表明,尽管在视觉上进行了缩放,但形状本身仍然相信它们是它们的原始高度和宽度。该形状的坐标也反映了未缩放的画布。例如,一个 Circle 会说它的 X 是 1000,即使它在屏幕上可见并且当时的最大画布宽度仅为 786。
如何将比例正确应用于我的运动翻译?
谢谢