2010-03-15 7 views
3

Disons que j'ai un contrôle qui a été désactivé. Il contient un tas d'éléments, mais je souhaite que l'un de ces éléments enfants reste activé.Comment est-ce que j'arrête les valeurs de propriété de couler vers le bas de l'arbre d'élément dans xaml?

Quelque chose comme ceci:

<ContentControl IsEnabled="False"> 
    <Border> 
     <Button Content="Button" IsEnabled="True"/> 
    </Border> 
</ContentControl> 

Ainsi, dans cet exemple, IsEnabled = réglage "True" du bouton se redéfinie par son parent. Y a-t-il un moyen d'empêcher cela?

Cela semble être une chose étrange à faire, mais j'ai une situation où, quand un contrôle est désactivé et qu'un utilisateur l'atténue, je veux toujours qu'un événement soit déclenché. J'ai lu dans WPF Unleashed qui enveloppait quelque chose dans un contrôle Frame, "... supprime le contenu du reste de l'interface utilisateur [et] les propriétés qui seraient normalement héritées à l'arrêt de l'arbre des éléments lorsqu'ils atteignent le cadre", mais envelopper le bouton dans l'exemple ci-dessus dans un cadre ne fonctionne pas.

Suis-je sur la mauvaise voie ici?

Répondre

5

qui est pas l'héritage, sa composition

le contrôle contenant est désactivé, donc tous ses contrôles contenus sont désactivés

permettent le conteneur et le contrôle que vous voulez, et désactiver les autres contrôles

+0

@Steven: Merci. "Ce n'est pas l'héritage, c'est la composition" Purement pour l'intérêt: Dans WPF Unleashed, Adam Nathan parle de "l'héritage de la valeur de la propriété", un terme qu'il utilise pour faire référence aux valeurs des propriétés. Donc il me semble qu'il y a le terme "héritage", que la plupart/tout le monde utilise pour désigner l'héritage basé sur la classe, "l'héritage de valeur de propriété" de Nathan, et "composition" (pour autant que je puisse voir sur MSDN, fait essentiellement référence à la disposition de l'interface utilisateur?). Corrigez-moi si j'ai tort, s'il-vous plait. J'essaie de maîtriser les bases. – cfouche

+1

@cfouche n'a jamais lu Nathan, mais je soupçonne qu'il est un peu lâche avec la terminologie. L'héritage est la sémantique: une personne est un mammifère, une bicyclette est un véhicule. La composition est confinement et utilisation: le changement dans votre poche, les bougies d'allumage dans un moteur. Dans ce cas, le contrôle contenant est comme une boîte, s'il ne s'ouvre pas (est désactivé) alors naturellement rien de 'dedans' ne peut être ouvert non plus. La même chose serait valable pour Visible (activé/désactivé est une forme plus faible de visible/non-visible); Si le conteneur n'est pas visible, son contenu est nécessairement invisible. –

4

Si vous pouvez hériter du bouton (ou de tout contrôle dont vous avez besoin), vous pouvez remplacer le CoerceValue pour éviter ce comportement (en fait, je pense que IsEnabled devrait fonctionner comme IsChecked, étant un bool ?, où null signifie utiliser la valeur parente, il faut garder une valeur spécifique ... mais comme ce n'est pas le comportement, utiliser cette solutio n va résoudre le problème):

public sealed class InheritedButton: 
    Button 
{ 
    static InheritedButton() 
    { 
    InheritedButton.IsEnabledProperty.OverrideMetadata 
    (
     typeof(InheritedButton), 
     new FrameworkPropertyMetadata 
     (
     true, 
     null, 
     _CoerceIsEnabled 
    ) 
    ); 
    } 
    private static object _CoerceIsEnabled(DependencyObject source, object value) 
    { 
    return value; 
    } 
}