【问题标题】:Shrink canvas but keep 'visible' screen proportions缩小画布但保持“可见”屏幕比例
【发布时间】:2015-09-18 06:25:52
【问题描述】:

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

使用控件的ManipulationDelta 中的ScaleTransform 很容易做到这一点。但我希望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 没有明显增加。但是,我可以在调试输出中看到高度/宽度值已从默认值 5000 更改为 6000.13~。

谁能告诉我我做错了什么?或者如果有更好的方法来做到这一点?请注意,Canvas 并不是真正内置的,而是来自 Win2D 的 CanvasControl,尽管这无关紧要。

【问题讨论】:

  • 您确定这不能正常工作吗?我本来预计,如果您将渲染变换放大一定数量,然后将控件缩小相同数量,您最终会在屏幕上得到相同大小的东西。
  • 是的,控件的WidthHeight 值确实发生了变化,但控件的外观没有明显差异,即我可以注释掉上面代码中的最后两行而没有任何明显的区别.

标签: c# xaml windows-store-apps winrt-xaml win2d


【解决方案1】:

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

相反,我建议您使用 GestureRecognizer 类来处理您的输入。

保持 CanvasControl 相同的大小,但根据 GestureRecognizer 的事件调整您绘制的内容。绘图会话上的 Transform 属性可能有助于调整您在控件中绘制的项目的比例。

【讨论】:

  • 我想这应该可行,但我最终使用了您在this answer 中提到的屏幕外渲染目标,并在绘图会话中绘制了渲染目标。
猜你喜欢
  • 1970-01-01
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
  • 2010-12-31
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
相关资源
最近更新 更多