【问题标题】:Why InitializeComponent is public为什么 InitializeComponent 是公开的
【发布时间】:2012-05-10 08:11:52
【问题描述】:

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

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

【问题讨论】:

  • 如果不调用 initializeComponent XAML 将无法解析
  • @Sharun,是的,但不应在控件之外调用它
  • @Sharun:是在控件的构造函数内部调用的,不是吗?所以它不必公开......
  • 你是对的。误解了这个问题。我猜你必须进入每个文件并更改它。

标签: .net wpf user-controls initializecomponent


【解决方案1】:

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

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

IComponentConnectorBaml2006Reader 在内部使用。

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

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

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

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

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

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

还有一个SO QA discussion,可以帮你详细解释一下

【讨论】:

  • 更重要的是,外部代码总是可以通过简单地将对象转换为接口类型来进行调用。显式实现 InitializeComponent() 因此它是私有的,因此不能解决任何问题。
【解决方案2】:

如果你控制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">

【讨论】:

  • 但我需要公开控制权,我只想隐藏 InitializeComponent
  • @Idsa 隐藏它?什么原因?
  • @Erode,我为什么要公开它?
  • @Idsa 我在想您可能希望在加载和解析 BAML 之前控制逻辑。它不能真的被滥用,它并不危险。这对我来说都是无害的,这就是为什么我问为什么隐藏它对你很重要。
  • @Erode,我不想改变任何逻辑,我只是​​不想让我的控制用户看到这个方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-17
  • 1970-01-01
  • 2019-09-13
  • 2018-12-23
  • 2011-01-04
  • 1970-01-01
相关资源
最近更新 更多