visual ventanas usar tutorial studio navegacion español entre ejemplos como wpf xaml attached-properties

ventanas - wpf tutorial



¿Cómo funcionan exactamente las propiedades adjuntas en WPF? (3)

Aquí hay dos conceptos: propiedades de dependencia y propiedades de dependencia adjuntas . Las "Propiedades adjuntas" son propiedades de dependencia y, como tales, admiten la herencia de valor de propiedad de dependencia.

Acerca de las propiedades básicas de dependencia, una afirmación muy aproximada sería que básicamente heredan sus valores de los elementos principales en el árbol wpf (lógico / visual). Una propiedad de dependencia (asociada o no) hereda su valor "hacia abajo" si sus metadata se establecen con FrameworkPropertyMetadataOptions . Heredar bandera, y en muchos casos esto es así.

Las propiedades adjuntas son propiedades que se pueden establecer en cualquier objeto wpf (básicamente, al menos un DependencyObject) a través del método DependencyObject.SetValue . El propósito de este mecanismo es "adjuntar" a otros objetos la información que necesitan los objetos principales, no los objetos propios. Por ejemplo, el Grid.Row es una propiedad adjunta requerida por el Grid para colocar elementos dentro de su área de renderizado.

Las propiedades de dependencia son heredadas "hacia abajo" automáticamente por el sistema de objetos wpf.

Las propiedades adjuntas se examinan "hacia arriba" explícitamente, en el código de objetos específicos. En el caso de Grid, al determinar dónde colocar sus artículos, verifica el valor de las propiedades adjuntas de Grid.Row y Grid.Column en cada elemento contenido.

También suele ser la técnica para crear propiedades adjuntas personalizadas que modifican de alguna forma los objetos a los que están vinculados (por ejemplo, la funcionalidad Drag''n''Drop a través de las propiedades adjuntas ).

Como nota adicional, un buen ejemplo de herencia de una propiedad adjunta es TextElement.FontFamily . Las propiedades Grid.Row y Grid.Column no tienen establecido el indicador Heredades.

TextElement.FontFamily, desde Reflector:

FontFamilyProperty = DependencyProperty.RegisterAttached("FontFamily", typeof(FontFamily), typeof(TextElement), new FrameworkPropertyMetadata(SystemFonts.MessageFontFamily, FrameworkPropertyMetadataOptions.Inherits | FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure), new ValidateValueCallback(TextElement.IsValidFontFamily));

Grid.Row, desde Reflector:

RowProperty = DependencyProperty.RegisterAttached("Row", typeof(int), typeof(Grid), new FrameworkPropertyMetadata(0, new PropertyChangedCallback(Grid.OnCellAttachedPropertyChanged)), new ValidateValueCallback(Grid.IsIntValueNotNegative));

Estoy un poco desconcertado sobre cómo las propiedades adjuntas realmente transmiten sus valores a los elementos padres o secundarios. TextElement.FontFamily hace que los elementos secundarios hereden el valor asignado a esa propiedad (una operación aparentemente descendente, de padre a hijo). Grid.Column hace que un elemento principal muestre ese elemento en una posición particular (una operación aparentemente ascendente, de niño a principal). ¿Cómo saben los valores de propiedades adjuntas fluir hacia arriba o hacia abajo? ¿Es incorrecta mi concepción de esto o falta alguna pieza que ponga todo esto en perspectiva?

<StackPanel TextElement.FontFamily="Wingdings"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <Button Grid.Column="1" Content="My Button"/> </Grid> </StackPanel>


Desde MSDN :

Aunque las propiedades adjuntas son configurables en cualquier objeto, eso no significa automáticamente que el establecimiento de la propiedad produzca un resultado tangible, o que el valor alguna vez sea utilizado por otro objeto. En general, las propiedades adjuntas están pensadas para que los objetos procedentes de una amplia variedad de posibles jerarquías de clases o relaciones lógicas puedan informar información común al tipo que define la propiedad adjunta. El tipo que define la propiedad adjunta generalmente sigue uno de estos modelos:

  • El tipo que define la propiedad adjunta está diseñado para que pueda ser el elemento principal de los elementos que establecerá valores para la propiedad adjunta. El tipo itera sus objetos secundarios a través de la lógica interna contra una estructura de árbol de objetos, obtiene los valores y actúa de alguna manera sobre esos valores.

  • El tipo que define la propiedad adjunta se utilizará como el elemento secundario para una variedad de elementos principales y modelos de contenido posibles.

  • El tipo que define la propiedad adjunta representa un servicio. Otros tipos establecen valores para la propiedad adjunta. Luego, cuando el elemento que establece la propiedad se evalúa en el contexto del servicio, los valores de propiedad adjuntos se obtienen a través de la lógica interna de la clase de servicio.

Un ejemplo de una propiedad adjunta definida por los padres

El escenario más típico donde WPF define una propiedad adjunta es cuando un elemento primario admite una colección de elementos secundarios, y también implementa un comportamiento donde los aspectos específicos del comportamiento se informan individualmente para cada elemento secundario.

DockPanel define la propiedad adjunta DockPanel.Dock y DockPanel tiene un código de nivel de clase como parte de su lógica de representación (específicamente, MeasureOverride y ArrangeOverride). Una instancia de DockPanel siempre verificará si alguno de sus elementos secundarios inmediatos ha establecido un valor para DockPanel.Dock. Si es así, esos valores se convierten en entrada para la lógica de representación aplicada a ese elemento hijo en particular. Cada instancia de DockPanel anidado trata sus propias colecciones de elementos secundarios inmediatos, pero ese comportamiento es específico de la implementación de cómo DockPanel procesa los valores de DockPanel.Dock. Teóricamente es posible tener propiedades adjuntas que influyan en elementos más allá del padre inmediato. Si la propiedad adjunta DockPanel.Dock está establecida en un elemento que no tiene un elemento padre DockPanel para actuar sobre él, no se genera ningún error o excepción. Esto simplemente significa que se estableció un valor de propiedad global, pero no tiene un elemento primario DockPanel actual que pueda consumir la información.


En palabras simples, así es como lo entiendo (corrígeme si me equivoco).

Un objeto (A) implementa una propiedad que se adjuntará a otro objeto (B) (el objeto B ni siquiera sabe acerca de la existencia de esta propiedad "conectable"). El Objeto B necesita heredar de DependencyObject.

El Objeto A también implementa un método estático para verificar su propiedad "conectable" en otros objetos, A.GetAttachedProperty (B).

Si B tiene la propiedad adjunta de A, A.GetAttachedProperty leerá y devolverá su valor. De lo contrario, A intentará leerlo y devolverá nulo, ya que no está allí.