2017-09-28 8 views
0

Le style par défaut de mon contrôle personnalisé est défini dans Generic.xaml et fonctionne correctement.Définition du style implicite du contrôle personnalisé dans WPF

Cependant, lorsque j'essaie de changer le style de mon contrôle personnalisé de la même manière que l'on peut avec des commandes intégrées, rien ne se passe. Dans App.xaml Je suis en train de changer le style par défaut de mon contrôle en procédant comme suit:

<Style TargetType="{x:Type my:CustomControl}"> 
    <Setter Property="Background" Value="Red"/> 
</Style> 

Si je mets x: propriété clé du style et référence au-dessus de ce style en utilisant cette touche tout fonctionne très bien.

Est-il correct que la méthode de style ci-dessus fonctionne uniquement pour les contrôles intégrés et ne fonctionne pas pour les contrôles personnalisés, ou est-ce que je fais juste quelque chose de mal? Existe-t-il une solution réalisable pour réaliser ce type de style pour les contrôles personnalisés?

Mise à jour Dans cette situation, mon contrôle personnalisé est dérivé de System.Windows.Window.

+1

Êtes-vous la mise en DefaultStyleKeyProperty.OverrideMetadata dans le constructeur statique ou que vous faites une solution de contournement? – shadow32

+0

"Est-il correct que la méthode de style ci-dessus ne fonctionne que pour les contrôles intégrés et ne fonctionne pas pour les contrôles personnalisés ...?" Non ce n'est pas vrai. Vous avez probablement fait quelque chose de mal dans la déclaration de votre contrôle. Vous devriez le montrer aussi. – Clemens

+0

Suite aux commentaires de Clemens, j'ai essayé de reproduire mon cas dans un nouveau projet. Lorsque vous créez un contrôle personnalisé qui hérite de TextBox, le style implicite fonctionne correctement. Toutefois, lorsque vous utilisez exactement la même configuration et que vous modifiez simplement le contrôle pour hériter de Window (qui était mon problème d'origine), le style implicite ne fonctionne pas. Y a-t-il un problème avec le style implicite lorsque vous utilisez une fenêtre comme classe de base par opposition à d'autres contrôles? – user6836683

Répondre

0

J'ai finalement réussi à obtenir un style implicite pour que mon contrôle personnalisé fonctionne. Le style apparemment implicite peut ne pas fonctionner pour les contrôles dérivés car le style n'est pas automatiquement appliqué au contrôle. Pour ce faire, il faut définir manuellement la référence de la ressource. Mon contrôle personnalisé ressemble maintenant à ceci:

public class CustomControl : Window 
{ 
    static CustomControl() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl), new FrameworkPropertyMetadata(typeof(CustomControl))); 
    } 

    public CustomControl() 
    { 
     SetResourceReference(StyleProperty, typeof(CustomControl)); 
    } 
} 
-1

Oui, vous avez raison. Generic.xaml est utilisé pour les contrôles personnalisés et App.xaml pour les ressources à l'échelle de l'application (y compris les styles pour les contrôles intégrés). La spécification de TargetType pour un contrôle personnalisé dans App.xaml ne fonctionnera pas. Donc, l'utilisation de styles explicites (avec x:Key) semble être la solution la plus simple.

+0

C'est complètement faux. Vous pouvez bien sûr avoir un style de contrôle par défaut dans Generic.xaml (généralement dans un assemblage de bibliothèque de contrôle) et un autre style par défaut dans App.xaml. Ce dernier sera automatiquement basé sur le premier. – Clemens