Toon posts:

[C# / WPF] Tweede keer window openen werkt niet

Pagina: 1
Acties:
  • 143 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Beste mensen,

Het volgende werkt niet zoals het zou moeten werken:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using System.Windows;
using System.Data;
using System.Xml;
using System.Configuration;

namespace OpMaat.Applicatie
{
    public partial class Applicatie : Application
    {
        void StartApplicatie(object sender, StartupEventArgs args)
        {
            LoginScherm loginScherm = new LoginScherm();
            bool loginSchermResult = Convert.ToBoolean(loginScherm.ShowDialog());
            if (loginSchermResult == true)
            {
                HoofdScherm hoofdScherm = new HoofdScherm();
                hoofdScherm.sessieGebruikerId = loginScherm.sessieGebruikerId;
                hoofdScherm.Show();
            }
        }
    }
}


De bedoeling is dat nadat het loginscherm true heeft terug gegeven, het hoofdscherm wordt geopend. Belangrijk hierbij te melden is dat het beide XAML/WPF Forms zijn.

Het probleem zit niet in het tweede window, als ik deze namelijk open voor het hoofdscherm, werkt deze gewoon. Alleen wordt het loginscherm dan weer niet getoond. Ik krijg geen fouten, het programma wordt gewoon afgesloten. Het lijkt wel alsof het scherm wel geopend wordt maar direct weer gesloten en het programma dan denkt dat het klaar is.

[ Voor 13% gewijzigd door Verwijderd op 21-12-2006 17:14 ]


  • PhysicsRules
  • Registratie: Februari 2002
  • Laatst online: 31-03 07:26

PhysicsRules

Dux: Linux voor Eenden

Ik heb nog niet met WPF gewerkt, maar met Winforms is je app ook klaar. De Show() method returnt meteen, itt ShowDialog().

Wat je voor Winforms kan doen is Applicatie.Run(hoofdScherm). Daarmee geef je aan dat hoofdscherm je main form is en dat je app pas klaar is als dat scherm wordt afgesloten.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Stap er eens gewoon met een debugger doorheen. Dan kan je precies zien wat er gebeurd.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Draai je dit op Vista of op XP met .NET 3.0 installed? Ik heb iig problemen gezien op XP die niet voorkwamen op vista met exact dezelfde code, ook met nogmaals een scherm openen.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Verwijderd

Topicstarter
Ik draai hiermee op XP. Het probleem lost zich niet op door ShowDialog te gebruiken, dan gebeurt namelijk precies hetzelfde.

  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Ik heb net even zitten spelen en er een werkbaar iets uit gekregen. Probeer het volgende eens:
App.xaml
code:
1
2
3
4
5
<Application x:Class="GoT.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Startup="App_Startup">
</Application>


App.xaml.cs
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
namespace GoT {
    public partial class App : System.Windows.Application {
        void App_Startup(object sender, StartupEventArgs e) {
            MainWindow mw = new MainWindow();
            this.MainWindow = mw;

            Login lg = new Login();
            lg.ShowDialog();

            if (!lg.LoginStatus) {
                MessageBox.Show("Login failed!");
                this.Shutdown();
            }

            this.MainWindow.Show();
        }
    }
}


Het probleem hier is blijkbaar dat het eerste window dat je Show()'t door WPF gezien wordt als het "main" window. Als dat window dus sluit heeft ie geen referenties meer waar hij op zou moeten wachten en denkt ie dus (terecht) dat hij klaar is.

Ik heb nog een alternatieve manier gevonden. Je kunt op App.xaml de property ShutdownMode op OnExplicitShutdown zetten. Hierdoor zal de applicatie pas sluiten op het moment dat je App.Shutdown() aanroept. Voorbeeldje wordt dan zo:
App.xaml
code:
1
2
3
4
5
6
7
<Application x:Class="GoT.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Startup="App_Startup"
    StartupUri="MainWindow.xaml"
    ShutdownMode="OnExplicitShutdown">
</Application>

App.xaml.cs
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
namespace GoT {
    public partial class App : System.Windows.Application {
        void App_Startup(object sender, StartupEventArgs e) {
            Login lg = new Login();
            lg.ShowDialog();

            if (!lg.LoginStatus) {
                MessageBox.Show("Login failed!");
                this.Shutdown();
            }
        }
    }
}

Nadeel is wel dat je op je main window het Closed of Closing event moet afvangen en daar App.Shutdown() op aan moet roepen.

[ Voor 32% gewijzigd door MTWZZ op 22-12-2006 10:05 ]

Nu met Land Rover Series 3 en Defender 90

Pagina: 1