Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 错误:在类型上找不到匹配的构造函数_C#_.net_Wpf_Xaml - Fatal编程技术网

C# 错误:在类型上找不到匹配的构造函数

C# 错误:在类型上找不到匹配的构造函数,c#,.net,wpf,xaml,C#,.net,Wpf,Xaml,我有一个WPF应用程序,其中我使用多个表单。当我们启动应用程序时,有一个主窗体被打开,称为MainWindow.xaml。然后,此表单具有多个表单,这些表单将根据用户选项打开。有一个表单StartClassWindow.xaml。目前我正在处理此表单,因此我希望它直接启动,而不是MainWindow.xaml。为此,我更改了app.xaml startupuri: <Application x:Class="Class.App" xmlns="http://schemas

我有一个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>

您需要向
StartClassWindow
添加一个无参数构造函数,如下所示:

public StartClassWindow(string classData)
{
    InitializeComponent();
    className = classData;
    function();
}

public StartClassWindow()
{

}
public Login(IUserService userService)
或者,如果您不想拥有另一个构造函数,您可以覆盖
App.xaml.cs
中的方法,但您应该首先删除
App.xaml
中的
StartupUri=“StartClassWindow.xaml”
。如下图所示:

protected override void OnStartup(StartupEventArgs e)
{
    StartClassWindow st = new StartClassWindow("");
    st.Show();
}
“通常”,构造函数必须是无参数的:

public Login()
但是,由于您使用的是依赖项注入,如下所示:

public StartClassWindow(string classData)
{
    InitializeComponent();
    className = classData;
    function();
}

public StartClassWindow()
{

}
public Login(IUserService userService)
构造函数不是无参数的,如果没有告诉框架如何实例化页面,则框架无法实例化该页面

为此,有两种选择:

从构造函数中删除服务 就像这样,但您需要以不同的方式访问userservice:

public Login()

net 4.8和4.7之前版本,使用Unity(或Prism) 您可以使用类似于
Unity
的依赖项注入框架来注册组件。 这里描述的是:

如下所述:


.net 5 WPF,使用内置DI 如果您使用的是.NET5,这里有一个教程。确保同时注册窗口和服务:

下面是一个例子:

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();
}
专用void配置服务(ServiceCollection服务)
{
services.addScope();
services.AddSingleton();
}
启动时专用void(对象发送方、StartupEventArgs e)
{
var mainfown=serviceProvider.GetService();
mainWindow.Show();
}
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();
}