스플래시 스크린이 MessageBox를 닫으므로 WPF MessageBox를 설정하는 방법

StackOverflow https://stackoverflow.com/questions/576503

  •  05-09-2019
  •  | 
  •  

문제

나는 그것을 사용하고있다 스플래시 스크린 비트 맵을 설정하여 WPF의 기능 행동을 구축하십시오 SplashScreen까지. 스플래시 화면 뒤에 라이센스 정보가 확인되고 있으며 실패하면 메세지 박스.

이것에 따르면 피드백, MessageBox.owner는 스플래시 화면이기 때문에 다른 창이 메시지 상자 인 경우에도 스플래시 화면 창이 닫히면 메시지 상자를 닫으므로 사용자는 메시지 상자를 보지 못합니다.

따라서 해결 방법은 메시지 상자를 다른 창으로 설정하는 것이지만, 필요하지 않을 수도있는 다른 창을 인스턴스화해야한다는 의미입니다.

MessageBox.owner를 데스크탑 창으로 설정할 수 있습니까? 그리고 떠오르는 다른 기능은 어떻게 getDeskTopWindow () API 기능이지만 창 핸들과 MessageBox를 반환합니다. 소유자는 WPF 창입니다.

도움이 되었습니까?

해결책 3

나는 문제를 발견했다. 또한 빌드 인 스플래시 화면을 사용하고 있습니다. WPF Splashscreen이 MessageBox를 닫습니다

다른 팁

@nir가 그의 대답에서 지적했듯이 모달 대화 상자의 부모로 데스크탑 창을 사용하는 것이 좋지 않기 때문에 다음은 다음과 같은 세 가지 해결 방법이 있습니다.

1) 숨겨진 창을 사용하십시오. MessageBox 또는 기타 모달 대화 상자의 부모 역할을 할 작고 비 모달 창을 만듭니다. 이 접근법은 여기에 설명되어 있습니다.

http://social.msdn.microsoft.com/forums/en-us/wpf/thread/116bcd83-93bf-42f3-9bfe-da9e7de37546/

2) 비 모달 메시지 창을 만듭니다. 시작 모드를 명시 적 종료로 변경하고 비 모달 창을 사용하여 메시지를 표시하십시오. 이 접근법은이 stackoverflow 질문에 대한 답에 설명되어 있습니다.

WPF 4.0에서 스플래시 화면을 사용하면 예외 세부 정보가있는 메시지 상자가 즉시 사라집니다.

3) MessageBox를 두 번 호출하십시오. 분명히, 문제는 표시된 첫 번째 모달 대화에만 영향을 미칩니다. 따라서 첫 번째 오프닝 및 마감의 플래시를 신경 쓰지 않으면 모달 대화를 두 번 호출 할 수 있습니다.

https://connect.microsoft.com/visualstudio/feedback/details/600197/wpf-splash-screen-dismisses-dialog-box

개인적으로, 나는이 해결 방법을 좋아하지 않습니다. 유일한 다른 옵션은 내장 된 스플래시 스크린 기능을 피하고 처음부터 직접 굴리는 것입니다. 해당 경로를 더 조사하려는 경우 다음은 다음과 같습니다.

http://social.msdn.microsoft.com/forums/en-us/wpf/thread/8ddd49fd0-9cc9-43c6-b285-6f119ab8a32e/

마지막으로, 당신이 나 만큼이 문제에 짜증이 나면, 당신은 여기 에서이 버그를 수정하기 위해 Microsoft에 투표 할 수 있습니다.

http://connect.microsoft.com/visualstudio/feedback/details/600197/wpf-splash-screen-dismisses-dialog-box

나는이 솔루션을 직접 생각해 냈기 때문에 아마도 문제가있을 수 있지만 완벽하게 작동하는 것 같습니다.

Window temp = new Window() { Visibility=Visibility.Hidden };
temp.Show();
MessageBox.Show(temp, "An error occurred before the application could start.\n\nTechnical Details: " + ex.Message, "Fatal Error", MessageBoxButton.OK, MessageBoxImage.Stop);
App.Current.Shutdown(1);

코드를 게시 할 수 있습니까? 방금 새 WPF 응용 프로그램에서 app.xaml.cs 파일에 추가하려고했습니다.

protected override void OnStartup(StartupEventArgs e)
{
    if (MessageBox.Show("Start app?", "Confirm Start", 
        MessageBoxButton.YesNo) == MessageBoxResult.No)
    {
        this.Shutdown();
        return;
    }

    this.StartupUri = new Uri("Window1.xaml", UriKind.Relative);
    base.OnStartup(e);
}

... 그리고 예상대로 작동합니다 ( "시작 확인"프롬프트는 응답 할 때까지 "아니오"를 클릭하면 앱이 종료됩니다).

데스크탑 창은 올바른 부모가 아닙니다. 왜 다음을 읽으십시오.

http://blogs.msdn.com/oldnewthing/archive/2004/02/24/79212.aspx

이제이 게시물에 설명 된 문제는 MS가 주변에서 작업했기 때문에 그다지 발생하지 않습니다.이 게시물에서는 다음과 같은 방법을 볼 수 있습니다.

http://blogs.msdn.com/oldnewthing/archive/2006/11/02/931674.aspx

이것은 나에게 많은 도움이되었습니다 ..... 나에게 새로운 아이디어를 주었지만 여기서 본 예제 코드에는 수정이 필요합니다.

다음은 WPF의 간단한 예입니다. 이제 수정 중입니다.

버튼을 클릭하십시오

이 코드를 붙여 넣으십시오

if (system.windows.forms.messagebox.show ( "are u u sure", "delete", system.windows.messageboxbuttons.yesno, system.windows.messageboxicon.question) == System.Windows.Forms. DialOgresult.yes) {this.close (); } else {messagebox.show ( "삭제하지 않는 이유"); }

이것은 OP의 상황과 직접 관련이 없지만 특정 특수 상황에서 다른 창문 뒤에 메시지 박스에 숨겨져있는 다른 사람들에게는 유용 할 수 있습니다.

@dthrasher가 언급 한 바와 같이, 한 가지 해결책은 숨겨진 더미 창을 사용하는 것입니다. 그러나 때로는 충분하지 않습니다. 솔루션이 숨겨진 더미 창을 사용하는 것뿐만 아니라 MessageBox와 함께 사용할 때마다 최상위 속성을 켜는 상황이있었습니다.

     _formKludge.TopMost = true;

     MessageBox.Show(_formKludge, "Nice informative message.", "Super-duper Program",
                     MessageBoxButtons.OK, MessageBoxIcon.Error);

     _formKludge.TopMost = false;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top