2008-11-18 3 views
2

다른 유형의 하위 창을 열 수있는 MDI 응용 프로그램이 있습니다. 동일한 유형의 하위 창의 여러 (그러나 다른) 인스턴스를 열 수 있습니다. (예 : 자식 창 유형 A 인스턴스 3 개와 자식 창 유형 B 인스턴스 2 개를 열 수 있습니다. 사용자가 명시 적으로 여러 창으로 동일한 데이터를 끌지 않는 한 모든 5 개의 창은 서로 다른 엔터티이며 데이터를 공유하지 않습니다.) 각 자식 창 하나 이상의 ToolStrip이있는 ToolStripContainer가 있습니다.ToolStrip이 다른 ToolStripContainer에 도킹되지 않도록 방지하는 방법은 무엇입니까?

  1. 사용자가 ToolStrip을 A 유형의 자식 창에서 B 유형의 자식 창에있는 ToolStripContainer로 드래그하지 못하게하려면 어떻게해야합니까?
  2. 사용자가 자식 창 A의 한 인스턴스에서 같은 유형의 다른 인스턴스에있는 ToolStripContainer로 ToolStrip을 드래그하지 않았습니까?

사용자가 A 유형의 인스턴스 1에서 A 유형의 인스턴스 2로 ToolStrip을 드래그하지 못하도록하고, 인스턴스 2에서 물건을 선택한 다음 툴바에서 버튼을 클릭하여 무언가를 얻지 못하게하려고합니다. 이상한 일이 다른 창문에 일어난다. 마찬가지로 ToolStrip을 A 유형의 창에서 B 유형의 창으로 드래그하는 것은 의미가 없습니다. 작업은 해당 유형에 적용되지 않지만 사용자에게 모든 작업이 정상적으로 수행되는 것처럼 보이게합니다. 끌기.

ControlAdded 이벤트에 대한 자체 처리기를 추가하는 것만 큼 간단합니까? 아니면 더 좋은 방법이 있습니까? .NET 3.0에서 WinForms를 사용하고 있습니다.

편집 : 단계

  1. 는 새 Windows 응용 프로그램 프로젝트를 만듭니다.
  2. 새 사용자 컨트롤을 추가하십시오. 하나의 단추로 하나의 ToolStrip을 포함하는 ToolStripContainer를 컨트롤에 제공하십시오.
  3. 2 단계를 반복하여 UserControl2 클래스를 제공합니다.
  4. UserControl1과 UserControl2가 도구 상자에 나타나도록 솔루션을 컴파일하십시오.
  5. UserControl1 및 UserControl2를 폼으로 끌어옵니다. 경계선이 어디에 있는지 알 수 있도록 경계선을 설정하십시오.
  6. 앱을 실행합니다.
  7. 이 UserControl1에있는 컨테이너에서 ToolStrip에 드래그하고 UserControl2를의 용기 (UC1 제로 TOOLSTRIPS 및 UC2 두 TOOLSTRIPS를 떠나.)
  8. 지금 만 UserControl1에있는 코드에 액세스 할 수 상상에 놓으 지금 가능 . 사용자가 ToolStripContainer 인스턴스에서 ToolStrip을 드래그하지 못하게하려면 어떻게해야합니까?
+0

나는 당신이 가지고있는 문제를 재현하려고 노력했지만 작동시키지 못하고있다. 같은 양식의 인스턴스 두 개를 만들면 도구 모음을 처음부터 다른 것으로 드래그 할 수 없습니다. –

+0

repo 단계를 참조하십시오. 양식의 인스턴스가 두 개가 아닌 두 개의 개별 사용자 컨트롤이있는 폼의 인스턴스는 하나뿐입니다. –

답변

0

ToolStripContainer의 DragEnter 및 DragLeave 이벤트를 사용하여 컨테이너에서 끌거나 수락 한 ToolStrip을 식별하려 했습니까?

+0

모든 ToolStripContainer를 소유하고 액세스 할 수있는 경우에만 작동합니다. 위의 A/B 예제를 참조하십시오. –

+0

문제점을 재현하려고 시도했지만 ToolStrip에서 한 인스턴스에서 다른 인스턴스로 (동일한 유형의 경우에도) 드래그 할 수 없습니다. 그래서 당신이 요구하는 것은 기본 동작이어야합니다 ... – Hinek

+0

나는 (귀하의 단계를 따라) 그것을 재현 할 수 있습니다 – Pondidum

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가에서 상속 컨트롤에 모든 코드를 삽입하고, 그것이 좋은 캡슐화 된 솔루션을 의미한다, 당신을 위해 모든 일을 가질 수있다.

+0

그것은 모든 코드에 액세스 할 수있는 경우에만 작동합니다. 제출 자료의 제 8 단계를 참조하십시오. (사실 실제로 작동하는지 잘 모르겠다 : 당신이 이벤트 핸들러를 ToolStrip.EndDrag 이벤트에 붙이는 것처럼 보입니다. 내장 된 핸들러가 여전히 실행되어 드롭 작업을 수행합니다. 툴바 소스 코드,하지만 그렇지 않습니다.) –

관련 문제