Как предотвратить закрепление ToolStrip в другом ToolStripContainer? - PullRequest
2 голосов
/ 18 ноября 2008

У меня есть приложение MDI, которое позволяет мне открывать различные типы дочерних окон. Я могу открыть несколько (но разных) экземпляров одного и того же типа дочернего окна. (Пример: я могу открыть 3 экземпляра дочернего окна типа A и 2 экземпляра дочернего окна типа B. Все 5 окон являются отдельными объектами и не обмениваются данными, пока пользователь явно не перетаскивает одни и те же данные в несколько окон.) Каждое дочернее окно имеет ToolStripContainer с одним или несколькими ToolStrips. Как мне помешать:

  1. пользователь перетаскивает ToolStrip из дочернего окна типа A в ToolStripContainer в дочернем окне типа B?
  2. пользователь перетаскивает ToolStrip из одного экземпляра дочернего окна A в ToolStripContainer в других экземплярах окна того же типа?

Я пытаюсь запретить пользователю перетаскивать ToolStrip из экземпляра 1 типа A в экземпляр 2 типа A, выбирать некоторые элементы в экземпляре 2, а затем нажимать кнопку на панели инструментов только для того, чтобы произошло нечто странное какое-то другое окно. Точно так же не имеет смысла перетаскивать ToolStrip из окна типа A в окно типа B - действия не применяются к этому типу, но для пользователя это выглядит так, как будто все в порядке, потому что я позволил им сделать перетаскивание.

Это так же просто, как добавить свой собственный обработчик для события ControlAdded, или есть лучший способ сделать это? Я использую WinForms в .NET 3.0.

edit: шаги по воспроизведению

  1. Создание нового проекта приложения Windows.
  2. Добавить новый пользовательский элемент управления. Дайте элементу управления ToolStripContainer, который содержит одну ToolStrip с одной кнопкой.
  3. Повторите шаг 2, чтобы получить класс UserControl2.
  4. Скомпилируйте решение, чтобы UserControl1 и UserControl2 отображались в вашем наборе инструментов.
  5. Перетащите UserControl1 и UserControl2 на форму. Установите границы, чтобы вы знали, где находятся границы.
  6. Запустите приложение.
  7. Теперь возможно перетащить ToolStrip из контейнера в UserControl1 и поместить его в контейнер в UserControl2 (оставив нулевые ToolStrips в UC1 и два ToolStrips в UC2.)
  8. Теперь представьте, что у вас есть доступ только к коду в UserControl1. Как предотвратить перетаскивание пользователем ToolStrip из этого экземпляра ToolStripContainer?

Ответы [ 2 ]

1 голос
/ 08 мая 2009

Это похоже на взлом, но это работает (вроде) (извините, 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 отличается от того, который был при перетаскивании, переместите панель инструментов обратно туда, где она была.

Я уверен, что это может быть свернуто в элемент управления, так что вам не нужно писать его для каждой панели инструментов.

Edit: Вы можете поместить весь этот код в элемент управления, который наследуется от ToolStripContainer, и заставить его выполнять всю работу за вас, что означает хорошее инкапсулированное решение.

0 голосов
/ 18 декабря 2008

Вы пытались использовать DragEnter и DragLeave Events ToolStripContainer, чтобы идентифицировать ToolStrip, перетащенную поверх контейнера, принять или отклонить его?

...