Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Prerrequisitos
Se supone que puede agregar controles a la interfaz de usuario, establecer sus propiedades y adjuntar controladores de eventos. Para obtener instrucciones para agregar controles a la aplicación, consulta Agregar controles y controlar eventos. También se supone que conoce los conceptos básicos de cómo definir una plantilla personalizada para un control mediante la realización de una copia de la plantilla predeterminada y su edición. Para obtener más información sobre esto, consulta Plantillas de control.
El escenario de las clases TemplateSettings
Las clases TemplateSettings proporcionan un conjunto de propiedades que se usan al definir una nueva plantilla de control para un control. Las propiedades tienen valores como las medidas de píxel para el tamaño de determinadas partes del elemento de la interfaz de usuario. A veces, los valores son valores calculados que proceden de la lógica de control que normalmente no es fácil de anular o ni siquiera de acceder a ellos. Algunas de las propiedades están pensadas como valores From y To que controlan transiciones y animaciones de partes, y por lo tanto las propiedades TemplateSettings pertinentes vienen en pares.
Hay varias clases TemplateSettings . Todos ellos están en el espacio de nombres .Xaml.Controls.Primitives. Cada clase tiene una propiedad TemplateSettings asociada en el control correspondiente. Esta propiedad TemplateSettings es cómo se accede a los valores templateSettings del control y se pueden establecer enlaces de plantilla a sus propiedades.
Estos son algunos ejemplos de clases y propiedades relacionadas:
- ComboBoxTemplateSettings: valor de ComboBox.TemplateSettings
- GridViewItemTemplateSettings: valor de GridViewItem.TemplateSettings
- ListViewItemTemplateSettings: valor de ListViewItem.TemplateSettings
- ToggleSwitchTemplateSettings: valor de ToggleSwitch.TemplateSettings
- ToolTipTemplateSettings: valor de ToolTip.TemplateSettings
Las propiedades TemplateSettings siempre están pensadas para usarse en XAML, no en el código. Son subpropiedades de solo lectura de una propiedad TemplateSettings de solo lectura de un control primario. Para un escenario de control personalizado avanzado, donde va a crear una nueva clase basada en control y, por tanto, puede influir en la lógica de control, considere la posibilidad de definir una propiedad TemplateSettings personalizada en el control para comunicar información que podría ser útil para cualquier persona que vuelva a crear plantillas del control. Como valor de solo lectura de esa propiedad, defina una nueva clase TemplateSettings relacionada con el control que tenga propiedades de solo lectura para cada uno de los elementos de información que son relevantes para las medidas de plantilla, el posicionamiento de animación, etc., y asigne a los autores de llamadas la instancia en tiempo de ejecución de esa clase que se inicializa mediante la lógica de control. Las clases TemplateSettings se derivan de DependencyObject, para que las propiedades puedan usar el sistema de propiedades de dependencia para las devoluciones de llamada de cambio de propiedad. Pero los identificadores de propiedades de dependencia no se exponen como API pública, ya que las propiedades de TemplateSettings están diseñadas para ser de solo lectura para los llamadores.
Cómo usar TemplateSettings en una plantilla de control
Este es un ejemplo que procede de las plantillas de control XAML predeterminadas iniciales. Esta en particular procede de la plantilla predeterminada de ProgressRing:
<Ellipse
x:Name="E1"
Style="{StaticResource ProgressRingEllipseStyle}"
Width="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=TemplateSettings.EllipseDiameter}"
Height="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=TemplateSettings.EllipseDiameter}"
Margin="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=TemplateSettings.EllipseOffset}"
Fill="{TemplateBinding Foreground}"/>
El XAML completo de la plantilla ProgressRing es cientos de líneas, por lo que se trata de un pequeño extracto. Este XAML define una parte de control que es uno de los 6 elementos elipse que representan la animación giratoria para el progreso indeterminado. Como desarrollador, es posible que no le gusten los círculos y podría usar una primitiva de gráficos diferente o una forma básica diferente para el progreso de la animación. Por ejemplo, puede componer un ProgressRing que use un conjunto de elementos Rectangle organizados en un cuadrado. Si es así, cada componente de Rectángulo individual de la nueva plantilla podría tener este aspecto:
<Rectangle
x:Name="R1"
Width="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=TemplateSettings.EllipseDiameter}"
Height="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=TemplateSettings.EllipseDiameter}"
Margin="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=TemplateSettings.EllipseOffset}"
Fill="{TemplateBinding Foreground}"/>
La razón por la que las propiedades TemplateSettings son útiles aquí es porque son valores calculados procedentes de la lógica de control básica de ProgressRing. El cálculo divide el ActualWidth general y el ActualHeight de ProgressRing, y asigna una medida calculada para cada uno de los elementos de movimiento en sus plantillas para que las partes de la plantilla puedan ajustarse al contenido.
Este es otro ejemplo de uso de las plantillas de control XAML predeterminadas, esta vez mostrando uno de los conjuntos de propiedades que son from y To de una animación. Esto procede de la plantilla predeterminada comboBox :
<VisualStateGroup x:Name="DropDownStates">
<VisualState x:Name="Opened">
<Storyboard>
<SplitOpenThemeAnimation
OpenedTargetName="PopupBorder"
ContentTargetName="ScrollViewer"
ClosedTargetName="ContentPresenter"
ContentTranslationOffset="0"
OffsetFromCenter="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=TemplateSettings.DropDownOffset}"
OpenedLength="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=TemplateSettings.DropDownOpenedHeight}"
ClosedLength="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=TemplateSettings.DropDownClosedHeight}" />
</Storyboard>
</VisualState>
...
</VisualStateGroup>
De nuevo, hay un montón de XAML en la plantilla, por lo que solo mostramos un extracto. Y este es solo uno de varios estados y animaciones de tema, los cuales utilizan las mismas propiedades de ComboBoxTemplateSettings. Para ComboBox, el uso de los valores comboBoxTemplateSettings mediante enlaces exige que las animaciones relacionadas de la plantilla se detengan e inicien en posiciones basadas en valores compartidos y, por tanto, realicen la transición sin problemas.
Nota:
Cuando use valores TemplateSettings como parte de la plantilla de control, asegúrese de que establece propiedades que coincidan con el tipo del valor. Si no es así, es posible que tenga que crear un convertidor de valores para el enlace para que el tipo de destino del enlace se pueda convertir de un tipo de origen diferente del valor TemplateSettings . Para obtener más información, consulta IValueConverter.