2
  • GoDiagram 对象模型有一个 GoDocument。
  • GoViews 有对 GoDocument 的引用。
  • 如果用户对图表表面进行任何修改,则会引发一个 GoDocument.Changed 事件,其中包含事件参数中的相关信息。

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

那么问题来了,我如何在 GoDiagrams 中获得 BeforeEditing 或 BeforeResizing 类型的通知模型?有没有去过那里的人活着讲故事?

4

2 回答 2

2

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

例如,您可以定义一个 CustomView.ObjectResizing 可取消事件。在您覆盖 GoToolResizing.CanStart 时,您可以引发该事件。如果 CancelEventArgs.Cancel 属性变为 true,则 CanStart() 返回 false。

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

于 2008-09-30T04:19:48.590 回答
0

更改事件的事件参数 (GoChangedEventArgs) 有一个属性 IsBeforeChanging,它指示更改事件是从“RaiseChanging”方法 (true) 还是从 RaiseChanged (false) 引发的。这应该告诉您更改是否已经发生,但我知道没有办法取消它。

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

OnChanged(GoChangedEventArgs e)
{
  if(NotAllowed)
  {
    e.Undo();
  }
}
于 2008-09-24T21:17:17.283 回答