2016-08-15 6 views
1

호기심에서 Window의 생성자로 차례대로 FolderBrowserDialog이라는 두 개의 다른 인스턴스를 표시 할 수 없지만 WindowLoaded 이벤트에서 수행 할 수 있는지 궁금합니다.Window 생성자에서 FolderBrowserDialog를 두 번 표시 할 수없는 이유는 무엇입니까?

  • 예 1은 첫 번째 대화 (fbd1)를 표시하고 다음 중 하나를 표시하지 않습니다.
  • 예 2은 두 개의 대화 상자를 보여줍니다.

예 1 :

public partial class MainWindow : Window { 

    public MainWindow() { 
     InitializeComponent(); 

     using (var fbd1 = new FolderBrowserDialog()) { 
      fbd1.ShowDialog(); 
     } 
     using (var fbd2 = new FolderBrowserDialog()) { 
      fbd2.ShowDialog(); 
     } 
    } 
} 

예 2 : 그런데

public partial class MainWindow : Window { 

    public MainWindow() { 
     InitializeComponent(); 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) { 
     using (var fbd1 = new FolderBrowserDialog()) { 
      fbd1.ShowDialog(); 
     } 
     using (var fbd2 = new FolderBrowserDialog()) { 
      fbd2.ShowDialog(); 
     } 
    } 
} 

, 나는 또한 윈폼에서 테스트 한,이 능력은 거의 동일합니다.

그것의 Load의 이벤트 Form '는 Form의 생성자 '에서 작동하지만, Shown 이벤트에서 작동하지 않습니다. 레자 Aghaei 그의 두번째 코멘트에서 말했다

+4

'Form'의 생성자에'FolderBrowserDialog'가 2 개 표시되는 데는 문제가 없습니다. 주목해야 할 것은'ShowDialog'가 호출 될 때 대화 상자를 닫을 때까지 그 뒤에 나오는 코드가 실행되지 않는다는 것입니다. 첫 번째 문을 닫은 후에 두 번째 문구가 나타납니다. –

+1

첫 번째 대화 상자를 닫으면 두 번째 대화 상자가 닫히지 만 현재 'Form'이 보이지 않고 작업 표시 줄에 표시되지 않기 때문에 두 번째 대화 상자가 활성화되지 않고 다른 창 뒤에 열립니다. 열려있는 창을 보려면 Alt + Tab을 누르면 두 번째 대화 상자가 나타납니다. 그러나 'Form'이 보이면 (예 :'Shown'에서 코드를 실행할 때)이 문제는 발생하지 않습니다. –

+0

게시 한 코드가 정상적으로 작동합니다. 방해가되는 두 개의 대화 상자 사이에 다른 코드가있을 수 있습니다. – DavidG

답변

6

당신이 원하는 대답은 실제로 정답이 아니며 실제로는 입니다. 두 번째 대화 상자를 활성화하십시오. 활성화 상태와 Z- 순서는 별개의 창 속성입니다. 전경을 잃어 버렸기 때문에 대화 상자를 볼 수 없습니다. 하나는 포 그라운드에 머물 수있는 창문이있을 때만 계속 사용할 수 있습니다.

프로그램은 시작 후 별도의 창으로 전경을 훔치는 ~ 6 초 가져옵니다. 시간 제한은 쉽게 볼 수 있습니다. Windows에는 Cursors.AppStarting 커서 (모래 시계가있는 작은 화살표)가 표시됩니다. 첫 번째 대화 상자를 포어 그라운드로 가져 오기 위해 노력했습니다. 그러나 다음에 일어나는 일은 잘못 될 운명입니다. 사용자가 대화 상자를 닫으면 앱에 포 그라운드로 이동할 수있는 창이 남아 있지 않습니다. 윈도우는 이제 다른 윈도우가 포어 그라운드에 놓이게되는데, 필연적으로 다른 프로세스가 소유하고있는 윈도우가 있습니다. 예를 들어 디버깅 할 때 VS 기본 창일 가능성이 큽니다. 그리고 6 초가 만료되었습니다. 두 번째 대화 상자가 나타나고 활성화되지만 물론 그 창에 의해 겹쳐집니다.

콜드 하드 사실은 대화 상자가 항상 소유자가 있어야한다는 것입니다.FolderBrowserDialog 너무 조금 용서, 소유자 인수없이 ShowDialog() 오버로드를 제공합니다. 매우 편리하고 항상 올바른 것은 아닙니다. 후드 아래에서 GetActiveWindow()를 사용하여 소유자를 찾습니다. 데스크톱 창이 없으면 예외를 던지지 않고 데스크톱 윈도우가 소유자가되고 문제가 발생합니다.

+0

흥미 롭습니다. :) – Drarig29

1

으로 : 첫 번째 대화 상자를 닫을 때

, 두 번째가 나타납니다,하지만 이후 Form 순간에 표시되지 및 작업에 표시되지 않습니다 -bar, 은 두 번째 대화 상자을 활성화하지 않으며 다른 창 뒤에 열려 있습니다. 열려있는 창을 보려면 Alt + Tab을 누르기 만하면 두 번째 대화 상자가 나타납니다. 그러나 양식이 표시되면 (예 : 코드를 실행하면)이 문제는 발생하지 않습니다.

이것은 내 호기심에 대한 답변입니다.