You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF中如何调用分部类带参构造函数?为何调用后触发无参构造?

问题原因分析

核心原因:存在两处不同的实例化逻辑,无参构造函数是被XAML解析器触发调用的

你遇到的两次构造函数调用本质是创建了两个不同的UserControl1实例,而非带参构造自动调用无参构造(你的代码里带参构造没有写: this(),不会主动触发无参构造执行),常见触发场景如下:

  • 你在项目的主窗口(通常是MainWindow.xaml)的XAML代码中直接声明了该自定义控件,比如写了类似<local:UserControl1 />的标签。WPF的XAML解析器在加载窗口可视化树时,会默认调用控件的公共无参构造函数来创建实例,这就是无参构造被触发的来源。
  • 你在App.xaml中配置了StartupUri="MainWindow.xaml",程序启动时会先执行你重写的OnStartup方法(触发第一次带参构造的调用),之后会自动加载StartupUri指向的主窗口,窗口加载过程中解析XAML就会触发第二次无参构造的调用。
  • 补充说明:你当前在OnStartup中创建的带参UserControl1实例没有被添加到任何窗口的可视化树中,这个实例不会在界面上显示,实际界面渲染的是XAML自动创建的无参构造实例。
排查与验证方法
  1. 打开MainWindow.xaml,删除所有和UserControl1相关的声明标签,再运行调试,观察无参构造是否还会被触发,如果不再触发即可确认是XAML实例化导致的问题。
  2. 在无参构造函数的断点处查看调用堆栈,可以看到调用来源为XAML解析相关的方法(如System.Xaml.dll!System.Xaml.XamlObjectWriter.CreateObject),也可以直接定位调用方。
扩展说明

WPF的XAML解析器要求所有放在XAML中声明的自定义控件必须提供公共无参构造函数,否则会出现XAML编译/运行时错误。如果你需要给XAML中声明的控件传参,可以通过依赖属性、附加属性或者Loaded事件处理的方式实现,不要依赖构造函数传参。

内容的提问来源于stack exchange,提问作者abdou93

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 22:36:03