我有一个WPF应用程序,我使用多个表单。当我们启动被称为MainWindow.xaml
的应用程序时,有一个主要形式被打开。然后,此表单具有多个表单,这些表单根据用户选项打开。表格StartClassWindow.xaml
。目前我正在处理此表单,因此我希望它直接启动而不是MainWindow.xaml
。为此,我更改了app.xaml startupuri
:
<Application x:Class="Class.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DispatcherUnhandledException="Application_DispatcherUnhandledException"
StartupUri="StartClassWindow.xaml">
<Application.Resources>
</Application.Resources>
</Application>
然后它开始给出如下错误:
在类型&#39; Class.StartClassWindow&#39;上找不到匹配的构造函数。您 可以使用Arguments或FactoryMethod指令来构造它 类型&#39。行号&#39; 3&#39;和行位置&#39; 9&#39;。
以下是StartClassWindow.xaml.cs
:
namespace Class
{
public partial class StartClassWindow : System.Windows.Window
{
public StartClassWindow(string classData)
{
InitializeComponent();
className = classData;
function();
}
//rest of the code.
}
}
答案 0 :(得分:12)
您需要向StartClassWindow
添加无参数构造函数,如下所示:
public StartClassWindow(string classData)
{
InitializeComponent();
className = classData;
function();
}
public StartClassWindow()
{
}
或者,如果您不想使用其他构造函数,则可以覆盖App.xaml.cs
中的OnStartup
方法,但是您应该删除中的StartupUri="StartClassWindow.xaml"
App.xaml
首先。如下所示:
protected override void OnStartup(StartupEventArgs e)
{
StartClassWindow st = new StartClassWindow("");
st.Show();
}
答案 1 :(得分:0)
“通常”,您的构造函数必须是无参数的:
public Login()
但是,由于您使用的是依赖注入,就像这样:
public Login(IUserService userService)
构造函数不是无参数的,如果没有被告知如何实例化,框架将无法实例化页面。
为此,有几个选项:
就像这样,但您需要以不同的方式访问用户服务:
public Login()
您可以使用像 Unity
这样的依赖注入框架来注册组件。
描述如下:
https://www.wpftutorial.net/ReferenceArchitecture.html
public class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
IUnityContainer container = new UnityContainer();
container.RegisterType<IUserService, UserService>();
MainWindow mainWindow = container.Resolve<MainWindow>();
mainWindow.Show();
}
}
手动导航,并自行构建:
NavigationService.Navigate(new LoginPage(new UserService);
如果您使用的是 .net 5,这里有一个教程。确保同时注册窗口和服务:
https://executecommands.com/dependency-injection-in-wpf-net-core-csharp/
这是一个例子:
private void ConfigureServices(ServiceCollection services)
{
services.AddScoped<IUserService,UserService>();
services.AddSingleton<MainWindow>();
}
private void OnStartup(object sender, StartupEventArgs e)
{
var mainWindow = serviceProvider.GetService<MainWindow>();
mainWindow.Show();
}