GoDiagrams でのサイズ変更や編集などのユーザー アクションをどのように「プレビュー」しますか?
質問
- GoDiagram オブジェクト モデルには GoDocument があります。
- GoView には GoDocument への参照があります。
- ユーザーが作図画面で何らかの変更を行うと、イベント引数に関連情報を指定して GoDocument.Changed イベントが発生します。
何らかのユーザーアクションが発生したときに通知を受け取り、コントローラーと協議して(必要に応じて許可/キャンセルできます)、そこから実際に変更するビュー更新命令を発行できるようにしたいと考えています。 ノースウッズ ゴーダイアグラム サードパーティのコンポーネント。
Changed イベントは、何かが起こったという通知です (過去形) - イベント ハンドラーで上記のすべてを実行すると、結果は ... になります。(それを待つ)...スタックオーバーフロー例外。(GoDocument.Changed ハンドラー > GoDocument の更新 > 新しい Changed イベントの発生..)
それで質問ですが、GoDiagrams で BeforeEditing または BeforeResizing のような通知モデルを取得するにはどうすればよいですか?そこに行ったことがある人で、生きて物語を語った人はいますか?
解決
参考までに...コンポーネント ベンダーの推奨事項は、これに適したメソッドをサブクラス化し、オーバーライドすることです。bool CanXXX() メソッドをオーバーライドし、キャンセル可能なカスタム イベントを発生させます。サブスクライバが false を返した場合は、救済します (ユーザーアクションを中止するには false を返します)CanXXXの。GoDiagrams にはこれのための組み込みメカニズムはありません。
たとえば、CustomView.ObjectResizingキャンセル可能なイベントを定義できます。gotoolresizing.canstartのオーバーライドでは、そのイベントを上げることができます。canceleventargs.cancelプロパティがtrueになった場合、canstart()がfalseを返すことができます。
他のヒント
変更イベントのイベント引数 (GoChangedEventArgs) には、変更イベントが "RaiseChanging" メソッドから発生したのか (true)、RaiseChanged (false) から発生したかを示すプロパティ IsBeforeChanging があります。これにより、変更がまだ行われたかどうかがわかるはずですが、変更をキャンセルする方法がわかりません。
私が提案できる最善の方法は、変更が許可されているかどうかを確認して実行するのではなく、変更が許可されているかどうかを確認することです。 ない 許可されない場合は、変更イベントの引数に対して「Undo」メソッドを呼び出します。つまり本質的には:
OnChanged(GoChangedEventArgs e)
{
if(NotAllowed)
{
e.Undo();
}
}