收缩画布,但保持'可见'屏幕比例

本文关键字:可见 屏幕 | 更新日期: 2023-09-27 18:13:12

我正在制作一个类似绘画的程序,其中包含Canvas和几个形状(用户可以绘制的线条,矩形等)。我希望用户能够使用缩放手势在很大程度上缩放Canvas(在合理的范围内,例如Width =1000和Height =1000的默认大小的5倍大小)。

这是很容易做到使用ScaleTransform从控制的ManipulationDelta。但我希望Canvas的大小和以前一样;这意味着如果Canvas占据了整个屏幕,然后用户向内挤压,Canvas和它的内容应该变小,但Canvas必须仍然占据整个屏幕空间(所以所有东西看起来都变小了,但现在有更多的空间供用户绘制形状)。

为了做到这一点,我尝试根据缩放的数量增加CanvasWidthHeight

private void ccDraw_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
    {
        CanvasControl ccSender = (CanvasControl)sender;
        CompositeTransform ctSender = ccSender.RenderTransform as CompositeTransform;
        ctSender.ScaleX *= e.Delta.Scale;
        ctSender.ScaleY *= e.Delta.Scale;
        ccDraw.Width *= 1/e.Delta.Scale; // sizing up inverse of amount scaled down
        ccDraw.Height *= 1/e.Delta.Scale;// same here
    }

你可能认为这段代码可以解决问题;我用比例的增加来抵消较小的规模,所以最终的结果是一样的——但是没有,Canvas确实缩小了,但Width/Height没有明显的增加。但是,我可以在调试输出中看到Height/Width值已经从默认值5000更改为6000.13~。

谁能告诉我我做错了什么?或者是否有更好的方法来做这件事?请注意,Canvas实际上不是内置的,而是来自Win2D的CanvasControl,尽管它应该无关紧要。

收缩画布,但保持'可见'屏幕比例

我认为修改渲染变换并不是真正正确的方法。

我建议你使用GestureRecognizer类来处理你的输入。

保持CanvasControl的大小不变,但根据gesturerecogizer的事件调整你绘制的内容。绘图会话中的Transform属性可以帮助您调整控件中绘制的项目的比例。