2010-10-26 24 views
5
<Border Name="ItemBorder" Margin="5 5 0 5" BorderBrush="Black" BorderThickness="1" Height="75" Width="75"> 
    <Border.Background> 
    <SolidColorBrush x:Name="ItemBorderBrush" Color="LightBlue"/> 
    </Border.Background> 
    <ContentPresenter/> 
</Border> 
<ControlTemplate.Triggers> 
    <EventTrigger RoutedEvent="someEvent"> 
    <BeginStoryboard> 
     <Storyboard TargetName="ItemBorderBrush" TargetProperty="Color" Duration="0:0:1" > 
     <!--Storyboard TargetName="ItemBorder" TargetProperty="Background.Color" Duration="0:0:1"> --> 
     <ColorAnimation To="White"/> 
     </Storyboard> 
    </BeginStoryboard> 
    </EventTrigger> 
</ControlTemplate.Triggers> 

Trataré de explicar mi pregunta con claridad. El nombre del objetivo Storyboard, cuando es "ItemBorder" (la línea comentada) funciona intermitentemente. A veces me sale un error que indica que no se puede encontrar el nombre "ItemBorder" en el alcance.Cuál es el significado de x: Nombre en xaml (WPF) y su uso con Storyboard

Decidí seguir un estilo de un ejemplo de MSDN y cambiar la propiedad de color directamente en el pincel, en lugar de tener el objetivo del guión gráfico como el borde y cambiar el color del pincel del borde por propiedad (la línea comentada). Esto parece funcionar

Sin embargo, Name="ItemBorderBrush" no se compila porque Name no es una propiedad de SolidColorBrush así que utilizo x:Name="ItemBorderBrush" Tanto Name y x:Name son aceptados para la Frontera. ¿Por qué es esto?

¿Qué significa la x: (cómo es diferente de x:NameName), y por qué habría que tiene la propiedad de Name frontera sólo funcionan con el guión gráfico a veces?

+0

ver también [En WPF, ¿cuáles son las diferencias entre la x:? Nombre y atributos nombre] (http://stackoverflow.com/questions/589874/in-wpf-what-are- the-differences-between-the-xname-and-name-attributes) –

Respuesta

4

El prefijo x: es simplemente fijando un atributo de un espacio de nombres separado:

Dentro de las declaraciones de espacio de nombres en la etiqueta raíz de muchos archivos XAML, que verá que normalmente hay dos declaraciones de espacios de XML . La primera declaración mapea la WPF cliente/XAML marco de espacio de nombres global como el valor por defecto:

xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"

la segunda declaración asigna un espacio de nombres separado XAML, la cartografía de que (típicamente) a la x: prefijo.

xmlns: x = "http://schemas.microsoft.com/winfx/2006/xaml"

La relación entre estos declaraciones es que la x: cartografía prefijo soporta los intrínsecos que son parte del lenguaje XAML definición, y WPF es una implementación que usa XAML como un lenguaje y define un vocabulario de sus objetos para XAML. Debido a los usos del WPF de vocabulario serán mucho más común que los intrínsecos XAML usos, el vocabulario WPF está asignada como predeterminado

Por lo tanto, la razón de que Name y x:Name ambos trabajan en la frontera se debe a que la frontera ha una propiedad llamada Nombre. También es compatible con el uso intrínseco de XAML de x:Name (que es lo que WPF usa para crear la instancia nombrada de la clase).

Sin embargo, SolidColorBrush no tiene la propiedad denominada Nombre, por lo que solo es compatible con el uso intrínseco XAML de x:Name.

1

En realidad sólo hay un nombre en XAML, el directorio x: Nombre.Un marco, como WPF, puede mapear opcionalmente una de sus propiedades a X: Name de XAML utilizando RuntimeNamePropertyAttribute en la clase que designa una de las propiedades de clases como asignación al atributo x: Name de XAML.

La razón por la que esto se hizo fue para permitir los marcos que ya tienen un concepto de "Nombre" en tiempo de ejecución, como WPF. En WPF, por ejemplo, FrameworkElement introduce una propiedad Name.

En general, una clase no necesita almacenar el nombre para que x: Name sea utilizable. Todo x: Nombre significa que XAML genera un campo para almacenar el valor en el código detrás de la clase. Lo que hace el tiempo de ejecución con ese mapeo depende del marco.

Entonces, ¿por qué hay dos formas de hacer lo mismo? La respuesta simple porque hay dos conceptos mapeados en una propiedad. WPF quiere el nombre de un elemento preservado en tiempo de ejecución (que se puede utilizar a través de Bind, entre otras cosas) y XAML necesita saber a qué elementos desea que estén accesibles los campos en el código detrás de la clase. WPF une estos dos al marcar la propiedad Nombre como un alias de x: Nombre.

En el futuro, XAML tendrá más usos para x: Name, como permitirle establecer propiedades al referirse a otros objetos por su nombre, pero en 3.5 y anteriores, solo se usa para crear campos.

Si usted debe usar una u otra es realmente una cuestión de estilo, no técnica. Dejaré eso a otros para una recomendación.

Véase también AutomationProperties.Name VS x: Name, AutomationProperties.Name es utilizado por las herramientas de accesibilidad y algunas herramientas de prueba.

refieren In WPF, what are the differences between the x:Name and Name attributes?

Cuestiones relacionadas