2009-04-06 5 views
0

Form.ShowDialog()로 대화 상자를 표시하고 있습니다. 양식은 TopMost로 설정됩니다. 일부 이미지 처리 계산은 백그라운드에서 비동기 적으로 수행됩니다. 결과는 Invoke에 의해 기본 폼으로 렌더링됩니다. 여태까지는 그런대로 잘됐다. 이상한 것은 매번 모달 대화 상자가 주 양식 뒤로 이동한다는 것입니다. Dialog를 구성하는 메시지가 Invoke에 의해 어떻게 든 방해 받으면 일어난다 고 생각합니다.TopMost 및 Invoke와 관련된 Z- 주문 관련 문제

이 아이디어를 해결하는 방법은 무엇입니까?

답변

1

절대적으로해서는 안되는 경우를 제외하고는 일반적으로 TopMost를 피하십시오. 절대적으로해서는 안되는 경우, 한 번에 하나 이상의 TopMost 양식을 사용하지 마십시오. (결국, 3 가지 TopMost 양식이있을 수 없습니다 - 누군가를 잃어 버리게됩니다).

먼저 Form.ShowDialog()으로 전화 할 때 소유자를 올바르게 설정했는지 확인하십시오. 이렇게하면 새 양식이 적절한 위치에 표시 될 수 있으며 주변에있는 경우 응용 프로그램의 동작이 향상됩니다. 둘째, 언제든지 TopMost 창이 하나만 있는지 확인하십시오. 이러한 일을 함께하지 않으면 가장 확실하게 문제가 발생할 수 있습니다. 예 :

// MainForm.cs -- Don't do this 
this.TopMost = true; 
childForm.TopMost = true; 
childForm.ShowDialog(/*no parent spec'd*/); 

이제 어떻게 되나요? 메인 양식과 어린이 양식 모두 최상위에 있으므로 잃어 버리게됩니다. MainForm은 최상위로 childForm을 만들었지 만 childForm에는 부모가 없습니다. 아마도 Windows가 데스크톱을 부모로 만들기로 결정했을 것입니다. 이로 인해 새로 열린 자녀 양식에 기본 양식이 남을 수 있습니다.

+0

ShowDialog (parentHandle)는 지금까지 말할 수있는 한 내 문제를 해결했습니다. 하지만 또 다른 질문이 생깁니다 : 왜 거기에 ShowDialog (/ * parent spec'd * /)가 없습니까; 100 가지 원인 중 99 가지에서만 작동합니까? 이런 종류의 버그로 인해 실제로 하나의 견과류가 생길 수 있습니다. 나는 코딩 UI가 코더를 통계 분야로 끌어 들일 것으로 기대하지는 못했다. :) – Matze

+0

좋은 질문입니다. 답변을 찾지 못했습니다. 가장 좋은 추측은 "http://preview.tinyurl.com/c6cfze"와 관련이 있습니다. 기본 API는 어떤 이유에서든 NULL 부모 창을 허용합니다 (어쩌면 ShowDialog()는 일부 컨텍스트에서 부모를 가질 수 없습니까?). –

0

어쩌면 당신은 ShowDialog를 같은 그 (VB 구문)에 대한 매개 변수로 소유 양식을 전달하는 시도 할 수 있습니다 : ... 그것은 아무것도 변경한다면

Form.ShowDialog(Me) 

확실하지,하지만 가치가 시도

또한 "양식이 TopMost로 설정되었습니다"라고 말하면 기본 양식 또는 모달 양식을 의미합니까? TopMost로 설정해야합니까? 때로는 TopMost 양식이 이상한 행동을 ...