Classes de paramètres du modèle

Prérequis

Il est supposé que vous savez ajouter des contrôles à une interface utilisateur, définir leurs propriétés et joindre des gestionnaires d’événements. Pour obtenir des instructions sur l’ajout de contrôles à une application, voir Ajouter des contrôles et gérer les événements. Nous partons également du principe que vous connaissez les bases de la définition d’un modèle personnalisé d’un contrôle en modifiant une copie du modèle par défaut. Pour plus d’informations, voir Démarrage rapide : modèles de contrôles.

Scénario relatif aux classes TemplateSettings

Les classes TemplateSettings fournissent un ensemble de propriétés qui sont utilisées lorsque vous définissez un nouveau modèle pour un contrôle. Les propriétés possèdent des valeurs, par exemple des mesures en pixels, correspondant à la taille de certains éléments d’interface utilisateur. Ces valeurs sont parfois des valeurs calculées qui proviennent de la logique de contrôle qui n’est généralement pas facile à remplacer ni même accessible. Certaines propriétés se veulent des valeurs From et To qui contrôlent les transitions et les animations des parties. Les propriétés TemplateSettings appropriées sont donc fournies par paires.

Voici plusieurs classes TemplateSettings. Elles figurent toutes dans l’espace de noms Windows.UI.Xaml.Controls.Primitives. Voici une liste des classes et un lien vers la propriété TemplateSettings du contrôle approprié. Cette propriété TemplateSettings indique comment accéder aux valeurs TemplateSettings du contrôle et établir des liaisons de modèle à ses propriétés :

Les propriétés TemplateSettings sont toujours destinées à être utilisées en XAML. Ce sont des sous-propriétés en lecture seule d’une propriété TemplateSettings en lecture seule d’un contrôle parent. Pour un scénario de contrôle personnalisé avancé, lorsque vous créez une classe basée sur Control et pouvez donc influer sur la logique de contrôle, pensez à définir une propriété TemplateSettings personnalisée sur le contrôle pour communiquer des informations pouvant être utiles à toute personne qui recrée le modèle du contrôle. Pour la valeur de cette propriété en lecture seule, définissez une nouvelle classe TemplateSettings liée à votre contrôle qui possède des propriétés en lecture seule pour chacune des informations qui sont pertinentes pour les mesures de modèle, le positionnement d’animation, etc. et qui donnent aux appelants l’instance d’exécution de cette classe, qui est initialisée à l’aide de votre logique de contrôle. Les classes TemplateSettings sont dérivées de DependencyObject afin que les propriétés puissent utiliser le système de propriétés de dépendance pour les rappels de modification de propriété. Mais les identificateurs de propriété de dépendance pour les propriétés ne sont pas exposés comme API publique, car les propriétés TemplateSettings sont censées être en lecture seule pour les appelants.

Comment utiliser TemplateSettings dans un modèle de contrôle

Voici un exemple qui provient des modèles de contrôles XAML par défaut de départ. Celui-ci provient du modèle par défaut 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}"/>

Comme le code XAML complet du modèle ProgressRing contient des centaines de lignes, il s’agit là d’un extrait minuscule. Ce code XAML définit une partie de contrôle qui est l’un des 6 éléments Ellipse qui illustrent l’animation de rotation pour une progression indéterminée. En tant que développeur, vous n’aimez peut-être pas les cercles et vous souhaitez peut-être utiliser une autre primitive graphique ou une autre forme de base pour la progression de l’animation. Par exemple, vous pouvez composer à la place un ProgressRing utilisant un ensemble d’éléments Rectangle organisés dans un carré. Si tel est le cas, chaque composant Rectangle individuel de votre nouveau modèle peut ressembler à ceci :

<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}"/>

Les propriétés TemplateSettings sont utiles ici, car ce sont des valeurs calculées à partir de la logique de contrôle de base de ProgressRing. Le calcul se divise en ActualWidth et ActualHeight de ProgressRing, et alloue une mesure calculée pour chacun des éléments de mouvement dans ses modèles pour que les composants de modèle puissent s’adapter au contenu.

Voici un autre exemple d’utilisation des modèles de contrôles XAML par défaut, qui montre cette fois l’un des ensembles de propriétés qui sont le From et la To d’une animation. Il provient du modèle ComboBox par défaut :

<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>

À nouveau, comme le code XAML contient de nombreuses lignes dans le modèle, il ne s’agit là que d’un extrait. Et ce n’est qu’un des nombreux états et animations de thème qui utilisent les mêmes propriétés ComboBoxTemplateSettings . Pour ComboBox, l’utilisation des valeurs ComboBoxTemplateSettings par le biais des liaisons impose que les animations associées dans le modèle s’arrêteront et commenceront aux positions qui sont basées sur les valeurs partagées. La transition sera donc parfaite.

Note Lorsque vous utilisez des valeurs TemplateSettings dans le cadre de votre modèle de contrôle, veillez à définir des propriétés qui correspondent au type de la valeur. Sinon, vous devrez peut-être créer un convertisseur de valeur pour la liaison afin que le type cible de la liaison puisse être converti à partir d’un type de source différent de la valeur TemplateSettings. Pour plus d’informations, voir IValueConverter.