Donc j'ai une classe; permet d'utiliser le ScrollViewer
classe à titre d'exemple. Il a une propriété de dépendance appelée Content
qui accepte n'importe quoi de type System.Object
, génial!
Disons que je tire une classe de ScrollViewer
, appelons ça ZoomScrollViewer
, il ajoute quelques opérations de base de zoom et de panoramique à l’aide de la souris et d’une pression du clavier. Il ajoute également une propriété de dépendance de sa propre propriété, AutoscaleContent
.
Maintenant, je veux pouvoir mettre un ZoomScrollViewer
dans une fenêtre de l'interface utilisateur, mais je seulement veux accepter une toile en tant que contenu. Naturellement, je crée un ZoomScrollViewer<T>
classe.
Cependant, comment puis-je modifier la propriété Content afin que seuls les éléments de type <T>
? Puis-je remplacer la propriété de dépendance? Je me suis un peu perdu et j'ai essayé:
public new T Content
{
get { return (T)base.Content; }
set { base.Content = value; }
}
Mais bien sûr, cela n'en fait plus une propriété de dépendance, de sorte que tout le code XAML échoue lorsque je configure les liaisons.
Edit: Il convient également de noter que j’ai jeté un œil à l’utilisation de:
ZoomScrollViewer.ContentProperty.OverrideMetadata(typeof(ZoomScrollControl2<T>), new PropertyMetadata(...?));
Pour voir si je peux faire quelque chose en utilisant cela, mais il semble que vous ne pouvez remplacer que la valeur par défaut, à moins que quelque chose ne me manque?
Mise à jour: j’ai maintenant essayé d’utiliser ce qui suit:
public class ZoomScrollControl2<T> : ZoomScrollViewer where T : FrameworkElement
{
static ZoomScrollControl2()
{
ContentProperty.OverrideMetadata(typeof(ZoomScrollControl2<T>), new FrameworkPropertyMetadata(typeof(ZoomScrollControl2<T>)));
}
}
public class CanvasZoomControl : ZoomScrollControl2<Canvas>
{
}
Ce que je pensais fonctionnerait, mais il semble toujours accepter un contenu de tout type.
Mise à jour: En bref, je ne sais pas si ce que je veux faire est possible, alors j’ai marqué la discussion comme étant la réponse, même si ce n’est pas une réponse en soi.
Réponses:
2 pour la réponse № 1Je suggère d'essayer cette approche comme suggéré par ce Article MSDN.
Il devrait remplacez le type de référence afin que vous puissiez y faire référence à l'aide d'un type dérivé.
Dependency Property
la visibilité n'est pas rendue explicite dans .NET Framework
pour les types dérivés, car la recherche de la bonne propriété parmi l’arbre des types a un coût en termes de performances, et en considérant que nous utilisons DP
sur la liaison de l'interface utilisateur, cela peut entraîner des problèmes de performances non souhaitables.