我们如何"预览"用户操作,例如在GoDiagrams中调整大小或者进行编辑?

时间:2020-03-06 14:30:46  来源:igfitidea点击:
  • GoDiagram对象模型具有一个GoDocument。
  • GoView具有对GoDocument的引用。
  • 如果用户在图形界面上进行了任何修改,则会引发GoDocument.Changed事件,并在事件参数中包含相关信息。

我希望在发生某些用户操作时得到通知,以便我可以与我的控制器协商(如果需要,可以禁止/取消它),然后从那里发出视图更新命令,以实际修改Northwoods GoDiagram第三方组件。
Changed事件是一个通知,表明发生了某些事情(过去时)在事件处理程序中执行上述所有操作都将导致....(等待它)... StackOverflowException。 (GoDocument.Changed处理程序>更新GoDocument>触发新的Changed事件。。)

那么问题来了,我如何在GoDiagrams中获得一种BeforeEditing或者BeforeResizing通知模型?有人去过那里讲故事吗?

解决方案

更改事件的事件参数(GoChangedEventArgs)具有属性IsBeforeChanging,该属性指示更改事件是通过" RaiseChanging"方法(true)还是RaiseChanged(false)引发的。那应该告诉我们更改是否已经发生,但是我无法取消它。

我所建议的最好方法是,不是检查是否允许更改并执行更改,而是检查是否不允许更改,以及是否未对change事件中的参数调用"撤消"方法。所以本质上:

OnChanged(GoChangedEventArgs e)
{
  if(NotAllowed)
  {
    e.Undo();
  }
}

JFYI ...
组件供应商的建议是为此子类化并重写适当的方法。重写bool CanXXX()方法,引发可取消的自定义事件。如果订户返回false,请为CanXXX纾困(返回false以中止用户操作)。
GoDiagrams中没有内置的机制。

For example, you could define a
  CustomView.ObjectResizing cancelable
  event.  In your override of
  GoToolResizing.CanStart, you can raise
  that event.  If the
  CancelEventArgs.Cancel property
  becomes true, you would have
  CanStart() return false.

来源http://www.nwoods.com/forum/forum_posts.asp?TID=2745