36

通过单击Run或按运行我的程序时Ctrl + F5,是否可以根据某些检查条件打开不同的窗口?

即,如果满足某些条件,我希望打开一个特定的窗口,但如果不满足,我想打开另一个窗口。

应该就像在打开任何窗口之前应该首先检查情况一样

if(File.Exists(<path-to-file>)
    Open Window 1
else
    Open Window 2

这可能吗?

4

4 回答 4

66

查看 App.xaml

消除StartupUri="MainWindow.xaml"

添加Startup="Application_Startup"新的事件处理程序

<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">

App.xaml.cs 后面的表单代码创建 Application_Startup 像...

    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();
        }
    }
于 2012-04-23T07:14:33.647 回答
9

您可以使用它App.xaml来启动您的应用程序,并且正如 Nikhil Agrawal 所说,StartupUri动态更改。

但是,您仍然可以从public static void Main(). 只需删除 中的StartupUri="MainWindow.xaml"属性,在你的项目中App.xaml添加一个Program包含Main方法的类,然后进入项目属性并将启动对象设置为YourAssemblyName.Program

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

请注意,STAThreadAttribute是必需的。如果您需要自己Application的. 但是,如果您不需要它,您可以直接使用基类并从项目中删除派生类。AppMainApplicationApplication

于 2012-04-23T07:17:41.410 回答
1

App.xaml我们有一个具有属性的Application标签。StartupUri我认为您应该在 App.xaml.cs 部分中编写此代码

public App()
{
      // Your Code
}

并设置StartUpUri为所需的 xaml 文件。

于 2012-04-23T07:11:28.997 回答
0

我知道这是一个很老的问题。但是我遇到了类似的问题,最近我在WPF .NET Core 3.1中使用依赖注入,感觉有人会遇到类似的挑战,所以发布这个答案

这是我的启动,您可以在其中设置条件启动窗口

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 构造函数

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

依赖注入

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));
        }
于 2020-07-11T07:22:55.257 回答