2012-01-08 56 views
0

我正在研究一个项目,该项目允许用户绘制某些内容并将其保存在数据库中。如何更改画布原点的位置

基本上,用户在画布上绘画,画布比画布大小大5倍,画布仍然在画面中央(或者画布在画布中央)。

为了使其对于画布大小更灵活(我们希望将来改变画布的大小),我们希望将画布的中心设置为原点,即(0,0 )位于画布的中心。所以当鼠标点击某个地方时,我得到的观点是基于画布中心来衡量的。

也许你会说:

  1. Canvas.RenderTransformOrigin = (.5,.5)。但我不问旋转中心,所以这不是解决方案。
  2. Canvas.RenderTransform = TranslateTransform (Canvas.Width/2.0, Canvas.Height/2.0)。但这只是将画布上的所有对象移动到中心。

您也可以这么说,为什么我们不只是将鼠标点的点数翻译为Canvas.Width/2.0, Canvas.Height/2.0,然后在渲染时将它们翻译回来。我们可以做到这一点,但是付出的努力太多了,因为我们还有很多其他操作需要实施,所以每次我们都必须来回翻译。

回答

0

它看起来像你已经想到了几乎所有可能的方法来解决这个问题,但是,我会看看我是否可以再添加一个!

Canvas属性,LeftTop,它规定了一个元素的位置是附加属性。您可以创建自己的附属属性,OffsetLeftOffsetTop,它们允许您根据所需的原点定位元素。这些实现起来很简单,当它们被获取/设置时,只需处理它们的更改事件即可设置各自的Canvas附加属性。

+0

嗨科林,谢谢你的回复。我也想到了一种类似的方法,即创建另一个画布'public PeterCanvas:Canvas',然后添加一些新的属性,例如'OffsetLeft','OffsetTop'(与您的一样)。但鼠标点击事件的坐标仍然是基于TopLeft边角来测量的(也许一个解决方法是'e.GetPosition(HelpCanvas)',其中'HelpCanvas'是一个0尺寸的画布,位于原始画布的中心) 。还有,还有很多工作要做,比如:RenderTransform行为(画布上的对象可以使用这个属性)... – 2012-01-08 22:54:51

+0

@PeterLee我知道你正在寻找一个简单的选项 - 但是没有一个我'我害怕! – ColinE 2012-01-09 06:21:12