WPF中如何调用分部类带参构造函数?为何调用后触发无参构造?
问题原因分析
核心原因:存在两处不同的实例化逻辑,无参构造函数是被XAML解析器触发调用的
你遇到的两次构造函数调用本质是创建了两个不同的UserControl1实例,而非带参构造自动调用无参构造(你的代码里带参构造没有写: this(),不会主动触发无参构造执行),常见触发场景如下:
- 你在项目的主窗口(通常是
MainWindow.xaml)的XAML代码中直接声明了该自定义控件,比如写了类似<local:UserControl1 />的标签。WPF的XAML解析器在加载窗口可视化树时,会默认调用控件的公共无参构造函数来创建实例,这就是无参构造被触发的来源。 - 你在
App.xaml中配置了StartupUri="MainWindow.xaml",程序启动时会先执行你重写的OnStartup方法(触发第一次带参构造的调用),之后会自动加载StartupUri指向的主窗口,窗口加载过程中解析XAML就会触发第二次无参构造的调用。 - 补充说明:你当前在
OnStartup中创建的带参UserControl1实例没有被添加到任何窗口的可视化树中,这个实例不会在界面上显示,实际界面渲染的是XAML自动创建的无参构造实例。
排查与验证方法
- 打开
MainWindow.xaml,删除所有和UserControl1相关的声明标签,再运行调试,观察无参构造是否还会被触发,如果不再触发即可确认是XAML实例化导致的问题。 - 在无参构造函数的断点处查看调用堆栈,可以看到调用来源为XAML解析相关的方法(如
System.Xaml.dll!System.Xaml.XamlObjectWriter.CreateObject),也可以直接定位调用方。
扩展说明
WPF的XAML解析器要求所有放在XAML中声明的自定义控件必须提供公共无参构造函数,否则会出现XAML编译/运行时错误。如果你需要给XAML中声明的控件传参,可以通过依赖属性、附加属性或者Loaded事件处理的方式实现,不要依赖构造函数传参。
内容的提问来源于stack exchange,提问作者abdou93
相关产品推荐
相关产品推荐

