2009-09-04 43 views

Respuesta

29

x: El nombre es simplemente una forma más explícita de decir "El atributo de nombre en este espacio de nombres XML específico". El hecho de que WPF no pueda compilarlo sin que se le haya dado esta pista porque está en el mismo ensamblaje es solo una limitación de cómo escribieron el analizador.

Si está preguntando por qué es así, no estoy seguro porque no lo escribí. Probablemente tiene algo que ver con la necesidad de poder resolver el atributo de Nombre (leer: Propiedad de Dependencia) a algo concreto ANTES de construir su UserControl1, en otras palabras, un catch-22.

7

Al principio, el compilador XAML se escribió para permitir la creación de "árboles" de objetos .net, había 101 proyectos dentro de Microsoft que usaban XAML. El compilador XAML no sabe nada sobre WPF.

La propiedad "Nombre" está definida por WPF y el compilador XAML no la conoce. WPF mapea la propiedad de nombre para que sea la misma que la "TAG de nombre" que es compatible con el compilador XAML. La "x" en "x: nombre" dice "use" como se define en el esquema XAML xml, "Name" dice que encuentre una propiedad llamada "nombre" en el objeto dado. Vea In WPF, what are the differences between the x:Name and Name attributes? para más detalles.

El compilador XAML es muy limitado en lo que se puede hacer con un control de usuario sin tener que cargar el ensamblado que define el control del usuario. Como el XAML necesita compilarse antes de que se pueda cargar el ensamblado, el compilador xaml claramente no puede cargar el ensamblado para un control que se implementa en el mismo ensamblaje. Por lo tanto, el compilador XAML ni siquiera sabe que el elemento es un control de usuario.

Properties that are defined on a user control (or its parent class) can therefore not be accessed. “Name” is a property that is defined in the parent (or super-parent) of a custom control.

El compilador XAML podría decir "El nombre no está definido como una propiedad"; si lo hizo, piense en cuántas personas dejarán de funcionar un control personalizado simple. Por lo tanto, el compilador XAML tiene un caso especial que proporciona un mensaje de error más útil al "adivinar" qué significa el código. Su suposición es en su mayoría correcta.

Todo lo que no sea el control de usuario más simple necesita estar en su propio conjunto, sin embargo, el control simple del usuario es tan común que se consideró que un caso especial valía la pena.

+2

'Por lo tanto, no se puede acceder a las propiedades que están definidas en un control de usuario (o su clase principal)'. - Eso no tiene sentido para mí. El establecimiento de otras propiedades, definido en la clase base, funciona '', por lo que no entiendo por qué el compilador no puede establecer el valor de la propiedad 'Nombre' WPF de la misma manera – nevermind

Cuestiones relacionadas