为什么InitializeComponent是公共的

时间:2012-05-10 08:11:52

标签: .net wpf user-controls initializecomponent

我的WPF用户控件的公共接口包含自动生成的InitializeComponent方法(包含在分部类中)。这对我来说是一个惊喜,因为我预计这样的内部东西是私密的。

有没有办法从用户控件公共接口中删除InitializeComponent?

2 个答案:

答案 0 :(得分:6)

InitializeComponent是在接口System.Windows.Markup.IComponentConnector上定义的方法,用于加载组件的编译页面。

请参阅此link下面的MSDN摘录,其中包含更多信息:

IComponentConnectorBaml2006Reader内部使用。

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">