7

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

有什么方法可以从用户控件公共界面中删除 InitializeComponent 吗?

4

2 回答 2

6

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

请参阅此链接MSDN的以下摘录,其中包含更多信息:

IComponentConnector由 内部使用Baml2006Reader

作为与应用程序和编程模型结合InitializeComponent使用的框架或技术所提供的基础设施的一部分,可以广泛观察到 的实现。XAML例如,每当您查看为 WPF 页面和应用程序中的 XAML 根元素生成的类时,您将看到在输出中定义的 InitializeComponent。该方法也存在于编译的程序集中,并在 WPF 应用程序模型中发挥作用,在 XAML 解析时加载 XAML UI 内容(我想因此InitializeComponent必须在接口中并且是公共的,以便其他外部 WPF 相关程序集可以使使用它)。

为了进一步解释这一点,请转到InitializeComponent()您的(say)Window1.g.cs类中的方法定义:say:WPFProject项目,并将其访问权限从更改publicprivate

(保持 .g.cs 文件在您的项目中打开,否则构建过程会覆盖此文件,您将无法看到错误)

现在,当您编译 WPF 项目时,它会引发如下编译错误:

错误 22“WPFProject.Window1”未实现接口成员“System.Windows.Markup.IComponentConnector.InitializeComponent()”。'WPFProject.Window1.InitializeComponent()' 无法实现接口成员,因为它不是公共的。

此外,InitializeComponent()标有 [System.Diagnostics.DebuggerNonUserCodeAttribute()]属性,因此您在调试时无法单步执行此方法。

还有另一个SO QA 讨论,可以帮助您更详细地解释

于 2012-05-10T11:02:49.017 回答
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">
于 2012-05-10T09:18:12.767 回答