2014-12-19 2 views
1

나는 많은 mdichildren과 메뉴 아이템을 가지고있는 mdiparent 박스를 가지고있다. 메뉴 항목의 각 버튼은 모든 양식을 숨긴 다음 해당 버튼에 해당하는 양식을 표시합니다. 나는 이런 식으로 할왜 mdi 아이를 숨기고 보여 주면 아이를 옮길 수 있습니까?

:

 //dontHide is the Form we want to show. 
     for(int i = 0; i < this.MdiChildren.Length; i++) 
     { 
      if (this.MdiChildren[i] != dontHide) 
      { 
       this.MdiChildren[i].Visible = false; 
      } 
     } 
     dontHide.Visible = true; 

전환 양식은 새로운 형태의 비트가 낮고 오래된 양식의 오른쪽에 위치하는 열 발생하지만, 현재 표시된 양식에 대한 메뉴 항목을 클릭하지 아무것도 (예상대로).

하지만, 이렇게 :

 //dontHide is the Form we want to show. 
     for(int i = 0; i < this.MdiChildren.Length; i++) 
     { 
      this.MdiChildren[i].Visible = false; 
     } 
     dontHide.Visible = true; 

도 현재 눈에 보이는 형태의 메뉴 항목이 새 양식을 열기로 같은, 오른쪽으로 이동시킨다 클릭. 왜 그런가요?

편집 : true로 볼 수 설정, (그래서 당신은 누군가가 이동 직전를 엿볼 위험을 감수하지 않음)를 표시 한 다음 폼을 중심으로 때 나는 또한 나타났습니다

완전히 어떤 중심 I를 재설정 끝났어.

+0

한 번에 ** 한 개의 ** 양식 만 표시하려면 왜 MDI를 사용해야합니까? TabConrol을 사용하면 Hans Passant가 게시 한 트릭이 [여기] (http://stackoverflow.com/a/6954785/2330053)에 표시됩니다. –

+0

이것은 내부 정말 간단한 응용 프로그램이며 MDI를 가지고 놀고있었습니다. 나는 그것들을 극대화하고있다. 그리고 그것은 작동하고있는 것처럼 보인다. 아마도 이렇게하는 것이 가장 좋은 방법은 아니지만 코드는 간단합니다. 복잡성이 심각하게 스케일링되지 않는 것처럼 보입니다. 나는 새로운 것을 배우고 있습니다. 이것이 고객을위한 것이라면 나는 올바른 방법으로 일을하고 있음을 확실히하기 위해 더 많은 시간을 할애 할 것입니다. – Lawtonfogle

답변

3

이것은 Winforms의 모호한 구현 세부 사항 때문에 발생합니다. Windows에 기본 제공되는 네이티브 MDI 지원은 자식 창 숨기기를 지원하지 않습니다. Winforms는 Visible 속성을 false로 설정할 때 자식 창을 삭제하여이 제한을 해결합니다. 그리고 그것을 다시 true로 설정할 때 다시 만들어야합니다.

이것은 다양한 부작용을 가질 수 있습니다. 물론 이것이 발생하면 기본 창 상태가 손실됩니다. Winforms는 속성에서 창을 다시 복원하는 데 꽤 괜찮은 지원을합니다. 하지만 한 가지가 이 아니기 때문에은 같은 위치에 창을 다시 만듭니다. 따라서 새 MDI 자식 창이 얻는 위치에서 이전 창에서 시차를두고 다시 만들 수 있습니다. 그것이 감독인지 의도적인지는 분명하지 않습니다. 후자에 대한 95 %의 확률.

var loc = dontHide.Location;   
    dontHide.Visible = true; 
    dontHide.Location = loc; 

하거나 수동으로 MDI 자식 폼의 startPosition입니다 설정 :

그렇지 않으면 간단한

는 어디에 당신이 그것을 다시 얻을 수있는 위치 속성 자신을 할당 할 수 있습니다를 해결하려면.

+0

위치를 수동으로 설정해 보았습니다.하지만 약간의 캐스트로 인해 순간적으로 깜박입니다. 새 위치로 이동하기 전에 기본값으로 재구성됩니다 (이전 창보다 약간 낮고 오른쪽으로). 허락하신다면, 나는 그 시간의 50 % 미만을 보았지만 여전히 눈에.니다. 그 말은, 나는 그것을 고치는 법을 묻지 않았고, 왜 그런 일이 일어 났으며, 당신이 그것을 설명 했으므로 나는 대답을 해줄 것입니다. – Lawtonfogle