通过单击Run
或按运行我的程序时Ctrl + F5
,是否可以根据某些检查条件打开不同的窗口?
即,如果满足某些条件,我希望打开一个特定的窗口,但如果不满足,我想打开另一个窗口。
应该就像在打开任何窗口之前应该首先检查情况一样
if(File.Exists(<path-to-file>)
Open Window 1
else
Open Window 2
这可能吗?
通过单击Run
或按运行我的程序时Ctrl + F5
,是否可以根据某些检查条件打开不同的窗口?
即,如果满足某些条件,我希望打开一个特定的窗口,但如果不满足,我想打开另一个窗口。
应该就像在打开任何窗口之前应该首先检查情况一样
if(File.Exists(<path-to-file>)
Open Window 1
else
Open Window 2
这可能吗?
查看 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();
}
}
您可以使用它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
的. 但是,如果您不需要它,您可以直接使用基类并从项目中删除派生类。App
Main
Application
Application
在App.xaml
我们有一个具有属性的Application
标签。StartupUri
我认为您应该在 App.xaml.cs 部分中编写此代码
public App()
{
// Your Code
}
并设置StartUpUri
为所需的 xaml 文件。
我知道这是一个很老的问题。但是我遇到了类似的问题,最近我在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));
}