收缩画布,但保持'可见'屏幕比例
本文关键字:可见 屏幕 | 更新日期: 2023-09-27 18:13:12
我正在制作一个类似绘画的程序,其中包含Canvas
和几个形状(用户可以绘制的线条,矩形等)。我希望用户能够使用缩放手势在很大程度上缩放Canvas
(在合理的范围内,例如Width
=1000和Height
=1000的默认大小的5倍大小)。
这是很容易做到使用ScaleTransform
从控制的ManipulationDelta
。但我希望Canvas
的大小和以前一样;这意味着如果Canvas
占据了整个屏幕,然后用户向内挤压,Canvas
和它的内容应该变小,但Canvas
必须仍然占据整个屏幕空间(所以所有东西看起来都变小了,但现在有更多的空间供用户绘制形状)。
为了做到这一点,我尝试根据缩放的数量增加Canvas
的Width
和Height
。
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属性可以帮助您调整控件中绘制的项目的比例。