2
  • GoDiagram オブジェクト モデルには GoDocument があります。
  • GoView には GoDocument への参照があります。
  • ユーザーがダイアグラム サーフェスで何らかの変更を行うと、GoDocument.Changed イベントが発生し、イベント引数に関連情報が含まれます。

一部のユーザー アクションが発生したときに通知を受け取りたいので、コントローラーに相談して (必要に応じて許可/キャンセル)、そこからビュー更新命令を発行して、実際にNorthwoods GoDiagramサード パーティ コンポーネントを変更します。
Changed イベントは、何かが起こったという通知です (過去形)。イベント ハンドラーで上記のすべてを実行すると、.... ( wait for it )... StackOverflowException が発生します。(GoDocument.Changed ハンドラー > GoDocument の更新 > 新しい Changed イベントの発生..)

質問です。GoDiagrams で BeforeEditing または BeforeResizing のような通知モデルを取得するにはどうすればよいですか? そこに行った人で、物語を語るために生きた人はいますか?

4

2 に答える 2

2

参考までに...コンポーネントベンダーの推奨事項は、これに適したメソッドをサブクラス化してオーバーライドすることです。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)には、変更イベントが「RaiseChanging」メソッドから発生したか(true)、RaiseChanged(false)から発生したかを示すIsBeforeChangingプロパティがあります。変更がまだ行われたかどうかはわかりますが、キャンセルする方法はわかりません。

私が提案できる最善の方法は、変更が許可されているかどうかを確認して実行する代わりに、変更が許可されていないかどうかを確認し、変更イベントの引数で「Undo」メソッドを呼び出さないかどうかを確認することです。だから本質的に:

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