2

さまざまな種類の子ウィンドウを開くことができる MDI アプリケーションがあります。同じ種類の子ウィンドウの複数の (ただし異なる) インスタンスを開くことができます。(例: 子ウィンドウ タイプ A の 3 つのインスタンスと子ウィンドウ タイプ B の 2 つのインスタンスを開くことができます。5 つのウィンドウはすべて別個のエンティティであり、ユーザーが同じデータを明示的に複数のウィンドウにドラッグしない限り、データを共有しません。) 各子ウィンドウ1 つ以上の ToolStrips を持つ ToolStripContainer があります。どうすれば防ぐことができますか:

  1. ユーザーがタイプ A の子ウィンドウからタイプ B の子ウィンドウの ToolStripContainer に ToolStrip をドラッグすることから?
  2. ユーザーは、子ウィンドウ A の 1 つのインスタンスから同じタイプのウィンドウの別のインスタンスの ToolStripContainer に ToolStrip をドラッグすることはできませんか?

ユーザーがタイプ A のインスタンス 1 からタイプ A のインスタンス 2 に ToolStrip をドラッグし、インスタンス 2 でいくつかのものを選択してから、ツールバーのボタンをクリックして、他のウィンドウに奇妙なことが起こるのを防ごうとしています。 . 同様に、タイプ A のウィンドウからタイプ B のウィンドウに ToolStrip をドラッグするのは意味がありません。アクションはそのタイプには適用されませんが、ユーザーにはすべて問題ないように見えます。ドラッグ。

ControlAdded イベントに独自のハンドラーを追加するのと同じくらい簡単ですか、それとももっと良い方法がありますか? .NET 3.0 で WinForms を使用しています。

編集:再現手順

  1. 新しい Windows アプリケーション プロジェクトを作成します。
  2. 新しいユーザー コントロールを追加します。1 つのボタンを持つ 1 つの ToolStrip を含む ToolStripContainer をコントロールに与えます。
  3. 手順 2 を繰り返して、UserControl2 クラスを作成します。
  4. ソリューションをコンパイルして、UserControl1 と UserControl2 がツールボックスに表示されるようにします。
  5. UserControl1 と UserControl2 をフォームにドラッグします。境界線がどこにあるかがわかるように境界線を設定します。
  6. アプリを実行します。
  7. ToolStrip を UserControl1 のコンテナーからドラッグして、UserControl2 のコンテナーにドロップできるようになりました (UC1 にゼロの ToolStrips と UC2 に 2 つの ToolStrips を残します)。
  8. ここで、UserControl1 のコードにしかアクセスできないとします。ユーザーが ToolStripContainer のインスタンスから ToolStrip をドラッグできないようにするにはどうすればよいですか?
4

2 に答える 2

1

これはハックのように感じますが、(ちょっと) 動作します (申し訳ありませんが、vb.net は c# ではありません):

Public Class UserControl2

    Private Sub tsMainMenu_BeginDrag(ByVal sender As Object, ByVal e As System.EventArgs) Handles tsMainMenu.BeginDrag

        tsMainMenu.Tag = tsMainMenu.Parent

    End Sub

    Private Sub ToolStrip1_EndDrag(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsMainMenu.EndDrag


        If Not tsMainMenu.Parent.Parent.Equals(CType(tsMainMenu.Tag, ToolStripPanel).Parent) Then

            CType(ToolStrip1.Tag, ToolStripPanel).Controls.Add(tsMainMenu)
        End If

    End Sub

End Class

簡単に言えば; コントロールのドラッグが終了したときに、親の ToolStripContainer がドラッグを開始したときと同じでない場合は、ツールストリップを元の場所に戻します。

すべてのツールバーに書き込む必要がないように、これをコントロールにロールインできると確信しています。

編集: このすべてのコードを ToolStripContainer から継承するコントロールに配置して、すべての作業を実行させることができます。これは、優れたカプセル化されたソリューションを意味します。

于 2009-05-08T09:23:36.983 に答える
0

ToolStripContainer の DragEnter および DragLeave イベントを使用して、コンテナー上にドラッグされた ToolStrip を識別し、受け入れまたは拒否しようとしましたか?

于 2008-12-18T10:40:32.623 に答える