2012-05-10 18 views
7

La interfaz pública de mi control de usuario WPF contiene el método InitializeComponent autogenerado (que está contenido en una clase parcial). Fue una sorpresa para mí ya que esperaba que algo interno fuera privado.Por qué InitializeComponent es público

¿Hay alguna manera de eliminar InitializeComponent de la interfaz pública de control de usuario?

+0

Sin una llamada a InitializeComponent XAML no conseguirá analizado – Sharun

+1

@Sharun, sí, pero no debería ser llamado fuera del control – SiberianGuy

+1

@Sharun: Se se llama dentro del constructor del control, ¿no es así? Entonces no tiene que ser público ... –

Respuesta

6

InitializeComponent es un método definido en la interfaz System.Windows.Markup.IComponentConnector y se utiliza para cargar la página compilada de un componente.

Ver MSDN extracto a continuación de esta link que cuenta con más información:

IComponentConnector se utiliza internamente por Baml2006Reader.

Las implementaciones de InitializeComponent son ampliamente observables como parte de la infraestructura proporcionada por los marcos o las tecnologías que usan XAML combinados con los modelos de aplicación y programación. Por ejemplo, siempre que observe las clases generadas para los elementos raíz de XAML en las páginas y aplicaciones de WPF, verá InitializeComponent definido en la salida. Ese método también existe en el ensamblado compilado y desempeña un papel en el modelo de aplicación WPF de cargar el contenido XAML UI en tiempo de análisis XAML (y supongo que InitializeComponent debe estar en una interfaz y ser público para que otros ensamblajes externos relacionados con WPF puedan hacer uso de eso).

Para explicar esto más, ir a la definición del método en su InitializeComponent() (por ejemplo): Window1.g.cs clase de, por ejemplo: WPFProject proyecto, y cambiar su acceso desde public a private

(mantener el .G. cs archivo abierto en su proyecto de lo contrario el proceso de construcción anula este archivo, y usted no será capaz de ver el error)

Ahora, cuando se compila el proyecto de WPF, que arroja un error de compilación de la siguiente manera:

Error 22 'WPFProject.Window1' no implementa miembro de interfaz 'System.Windows.Markup.IComponentConnector.InitializeComponent()'. 'WPFProject.Window1.InitializeComponent()' no puede implementar un miembro de interfaz porque no es público.

Además, InitializeComponent() está marcado con el atributo [System.Diagnostics.DebuggerNonUserCodeAttribute()] por lo que no se puede recorrer este método durante la depuración.

Hay otro SO QA discussion, que le ayudaría a explicar más en detalle

+1

Más al punto, el código externo siempre puede hacer la llamada simplemente al convertir el objeto al tipo de interfaz. La implementación explícita de InitializeComponent() por lo que es privado no resuelve ningún problema. –

0

¿Te sentirías mejor si hicieras tu control 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"> 
+0

Pero necesito mantener el control público, solo quiero ocultar InitializeComponent – SiberianGuy

+0

@Idsa ¿Ocultalo? ¿Por qué razón? – erodewald

+2

@Erode, ¿por qué razón debo mantenerlo público? – SiberianGuy

Cuestiones relacionadas