WPF - choose startup window based on some condition

前端 未结 4 1164
傲寒
傲寒 2020-12-08 09:53

When running my program by clicking Run or pressing Ctrl + F5, is it possible to open different windows based on some check condition?

I.e

相关标签:
4条回答
  • 2020-12-08 10:17

    You can use App.xaml to start up your application and, as Nikhil Agrawal said, change StartupUri dynamically.

    However, you can still start up your application from public static void Main(). Just delete the StartupUri="MainWindow.xaml" attribute in App.xaml, Add a Program class to your project containing a Main method, and then go to the project properties and set the startup object to YourAssemblyName.Program.

    [STAThread]
    public static void Main(string[] args)
    {
        var app = new Application();
        var mainWindow = new MainWindow();
        app.Run(mainWindow);
    }
    

    Note, the STAThreadAttribute is required. If you need your own derived version of Application, such as how WPF projects create a derived App class by default, you can use that in the Main in place of Application. But, if you don't need it, you can just use the base Application class directly and remove the derived one from your project.

    0 讨论(0)
  • 2020-12-08 10:27

    look into App.xaml

    remove StartupUri="MainWindow.xaml"

    add Startup="Application_Startup" new event Handler

    <Application x:Class="YourProject.App"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 Startup="Application_Startup">
    

    form code behind App.xaml.cs create Application_Startup like...

        private void Application_Startup(object sender, StartupEventArgs e)
        {
            //add some bootstrap or startup logic 
            var identity = AuthService.Login();
            if (identity == null)
            {
                LoginWindow login = new LoginWindow();
                login.Show();
            }
            else
            {
                MainWindow mainView = new MainWindow();
                mainView.Show();
            }
        }
    
    0 讨论(0)
  • 2020-12-08 10:30

    In App.xaml we have an Application tag having StartupUri attribute. I think u should write this code in App.xaml.cs section

    public App()
    {
          // Your Code
    }
    

    and set StartUpUri to desired xaml file.

    0 讨论(0)
  • 2020-12-08 10:31

    I know this is quite old question. But I came in to similar issue, recently where I am using Dependency Injection with WPF .NET Core 3.1 felt someone would have similar challenge so posting this answer

    Here is my startup where you can set your conditional startup window

    protected override async void OnStartup(StartupEventArgs e)
            {
                await host.StartAsync();
                var userService = host.Services.GetService<IUserRepository>();
                var lastActiveUser = userService.LastActive();
                if (lastActiveUser != null)
                {
                    DefaultWindow = host.Services.GetRequiredService<MainWindow>();
                    DefaultWindow.Show();
                }
                else
                {
                    DefaultWindow = host.Services.GetRequiredService<LoginWindow>();
                    DefaultWindow.Show();
                }
                base.OnStartup(e);
            }
    

    App Constructor for initializing host

    public App()
            {
                host = Host.CreateDefaultBuilder()  // Use default settings
                                                    //new HostBuilder()          // Initialize an empty HostBuilder
                       .ConfigureAppConfiguration((context, builder) =>
                       {
                           builder.SetBasePath(Directory.GetCurrentDirectory())
                           // Add other configuration files...
                           .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
                           Configuration = builder.Build();
    
                       }).ConfigureServices((context, services) =>
                       {
                           ConfigureServices(context.Configuration, services);
                       })
                       .ConfigureLogging(logging =>
                       {
                           // Add other loggers...
                           logging.ClearProviders();
                           logging.AddConsole();
                       }).Build();
            }
    

    Dependency Injection

    private void ConfigureServices(IConfiguration configuration,
            IServiceCollection services)
            {
                _services = services;
                _services.Configure<AppSettings>(Configuration
                    .GetSection(nameof(AppSettings)));
    
                _services.AddDbContext<SmartDbContext>(options =>
                {
                    options.UseSqlServer(Configuration.GetConnectionString("SqlConnection"));
                });
    
                _services.AddScoped<IUserRepository, UserRepository>();
                _services.AddScoped<ILoginDataContext, LoginDataContext>();
                _services.AddTransient(typeof(MainWindow));
                _services.AddTransient(typeof(LoginWindow));
            }
    
    0 讨论(0)
提交回复
热议问题