我的WPF用户控件的公共接口包含自动生成的InitializeComponent方法(包含在分部类中)。这对我来说是一个惊喜,因为我预计这样的内部东西是私密的。
有没有办法从用户控件公共接口中删除InitializeComponent?
答案 0 :(得分:6)
InitializeComponent
是在接口System.Windows.Markup.IComponentConnector
上定义的方法,用于加载组件的编译页面。
请参阅此link下面的MSDN
摘录,其中包含更多信息:
IComponentConnector
由Baml2006Reader
内部使用。
InitializeComponent
的实现作为使用XAML
结合应用程序和编程模型的框架或技术提供的基础结构的一部分,可以被广泛观察到。例如,每当您在WPF页面和应用程序中查看生成的XAML根元素类时,您将看到输出中定义的InitializeComponent。该方法也存在于已编译的程序集中,并在WPF应用程序模型中扮演角色,在XAML分析时加载XAML UI内容(我想因此InitializeComponent
必须在接口中并且是公共的,以便其他外部WPF相关程序集可以使用它。)
要进一步解释这一点,请转到(比方说):InitializeComponent()
类:Window1.g.cs
项目中WPFProject
方法的定义,并从public
更改其访问权限} private
(保持.g.cs文件在项目中打开,否则构建过程 覆盖此文件,您将无法看到错误)
现在,当您编译WPF项目时,它会抛出编译错误,如下所示:
错误22'WPFProject.Window1'未实现接口成员 'System.Windows.Markup.IComponentConnector.InitializeComponent()'。 'WPFProject.Window1.InitializeComponent()'无法实现 接口成员,因为它不公开。
此外,InitializeComponent()
标有[System.Diagnostics.DebuggerNonUserCodeAttribute()]
属性,因此您无法在调试时进入此方法。
还有另一个SO QA discussion,可以帮助您详细解释
答案 1 :(得分:0)
如果你控制了internal
,你会感觉更好吗?
<UserControl
x:Class="PBbase.Client.Navigation.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:ClassModifier="internal">