sådan set wpf MessageBox.Ejeren til desktop-vinduet, fordi SplashScreen lukker MessageBox

Jeg bruger den SplashScreen funktion i WPF ved at sætte en bitmap er Bygge Handling at Splashscreen. Bag splash screen, licenser oplysninger, der er ved at blive ind, og hvis det ikke lykkes vil jeg vise en MessageBox.

I henhold til denne Feedback, er det, fordi den Besked.Ejeren er splash skærmen, og så snart et andet vindue er åbent, selv om det er en Beskedboks splash skærmen vinduet er lukket, som så til gengæld lukker den Besked, så brugeren aldrig ser den Besked.

Så den løsning ville være at sætte den Besked.Ejeren til et andet vindue, men det ville betyde, at jeg er nødt til at instantiere et nyt vindue, som måske ikke engang være nødvendig.

Ville det være muligt at indstille den Besked.Ejeren til skrivebordet ved vinduet? Og hvordan, fordi den eneste anden funktion, der kommer til at tænke på den GetDesktopWindow() api-funktion, men der returnerer et vindue håndtag og MessageBox.Ejeren er en WPF Vindue.

OriginalForfatteren adriaanp | 2009-02-23

7 svar

  1. 9

    Siden ved hjælp af desktop-vindue som forælder til dine dialoger er ikke en god idé, som @Nir påpegede i sit svar, her er tre andre løsninger:

    1) Bruger et skjult vindue. Oprette en lille, ikke-modal window til at fungere som moderselskab for din Besked eller andre modale dialogbokse. Denne fremgangsmåde er beskrevet her:

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

    2) Oprette ikke-modal besked windows. Ændre din start-tilstand til eksplicitte lukning og bruge en ikke-modal-vindue til at vise din besked. Denne fremgangsmåde er beskrevet i svaret til dette StackOverflow-spørgsmål:

    MessageBox med undtagelse detaljer straks forsvinder, hvis brug velkomstbilledet i WPF 4.0

    3) Call Besked to gange. Tilsyneladende problemet påvirker kun den første modal dialogboks, der vises. Så kan du blot ringe til din modal dialogboks, to gange, hvis du ikke havde noget imod flash af den første åbning og lukning.

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

    Personligt, jeg ikke kan lide nogen af disse løsninger. Den eneste anden mulighed er at undgå den indbyggede SplashScreen funktionalitet og til at lave dit eget fra bunden. Her er et link, hvis du ønsker at undersøge at ruten videre:

    http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/8dd49fd0-9cc9-43c6-b285-6f119ab8a32e/

    Endelig, hvis du er generet af dette problem, som jeg er, kan du stemme for Microsoft at løse fejlen her:

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

    OriginalForfatteren dthrasher

  2. 9

    Jeg kom op med denne løsning for mig, så måske der er noget galt med det, men det ser ud til at fungere perfekt:

    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);
    Flot og enkel løsning. Men Visibility=Visibility.Hidden er egentlig ikke nødvendigt, da du kommer til at vise vinduet alligevel. I stedet for at undgå stænk visning af baggrunden vindue, jeg brugte: new Window { WindowState = WindowState.Minimized, ShowInTaskbar = false }
    new Window { AllowsTransparency = true,ShowInTaskbar=false,WindowStyle=WindowStyle.None, Background=Brushes.Transparent} kan gøre vinduet helt skjult, mens du indstiller synlighed eller vinduet tilstand vil medføre, at vinduet til at blive vist for et par millisec når Show() er påberåbe sig.

    OriginalForfatteren Alain

  3. 4

    Jeg har fundet problemet. Jeg er også ved hjælp af den indbyggede splash-skærm, som forårsager dette: WPF SplashScreen lukker MessageBox

    Spørgsmålet er nu, hvordan ville du angive ejeren af denne indstilling bruges til at deskop vindue?

    OriginalForfatteren adriaanp

  4. 1

    Kan du skrive noget kode? Jeg har lige prøvet at tilføje denne App.xaml.cs-fil i en ny WPF-applikation:

    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);
    }

    … og det virker som forventet (“Bekræft Start” prompt forbliver åben, indtil jeg har reageret, og hvis jeg klikker på “Nej” app ‘ en lukker ned).

    Matt, jeg har også prøvet det som du gjorde, og indså, at det virker, fordi jeg var ved hjælp af en splash screen, det lukker den Besked, uden splash skærmen der ikke lukke
    Så jeg tror, at nu er du nødt til at beslutte, om at lukke spørgsmålet som “Ikke længere relevante” eller (som @adriaanp foreslår i sin kommentar) omarbejde det så et andet spørgsmål.

    OriginalForfatteren Matt Hamilton

  5. 0

    dette har hjulpet mig meget …..
    Givet mig ny idé
    men det eksempel, kode, som jeg har set her er nogle ændringer, der er nødvendig

    her er et simpelt eksempel i wpf med ændring
    nu er det arbejder

    på knappen, klik på

    indsæt denne kode

    hvis (System.Windows.Former.MessageBox.Vis(“er du sikker”, “slet”, System.Windows.Former.MessageBoxButtons.YesNo, System.Windows.Former.MessageBoxIcon.Spørgsmål) == System.Windows.Former.DialogResult.Ja)
    {
    dette.Close();
    }
    andet
    {
    MessageBox.Vis(“hvorfor ikke slette”);
    }

    OriginalForfatteren

  6. 0

    Dette er ikke direkte relateret til OP ‘ s situation, men kan være nyttige for andre, der har problemer med Beskedboks, som er skjult bag andre vinduer i visse særlige situationer.

    Som @dthrasher nævner, en løsning er at bruge en skjult dummy-vinduet. Men nogle gange, selv det er ikke nok. Jeg havde en situation, hvor løsningen blev at ikke kun bruger et skjult dummy vinduet, men til gengæld på sin Øverste ejendom, når jeg brugte den med MessageBox.

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

    OriginalForfatteren RenniePet

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *