2010-08-12 13 views
0

Le résumé de mon problème: J'ai créé un UserControl où j'ai lié ma propriété de dépendance "Scheme" à la propriété Color d'un GradientStop, et cela a fonctionné parfaitement. Maintenant, après la conversion de mon UserControl à un contrôle personnalisé, cette liaison ne fonctionne plus, et je ne sais pas pourquoi.Pourquoi ne puis-je plus lier GradientStop Color à une propriété Dependency de mon contrôle?

EDIT: réplication du problème de contrôle personnalisé: http://www.megaupload.com/?d=0006XVYD

EDIT: Un contrôle équivalent d'utilisateur où Travaux de reliure: http://www.megaupload.com/?d=W13GTD4E

Voilà comment je déclarais mes dictionnaires de ressources pour mon UserControl dans le UserControl1.xaml fichier.

Dans UserControl1.xaml

<!-- Resources --> 
<UserControl.Resources> 
    <ResourceDictionary> 
    <ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="Colors.xaml"/> 
    <ResourceDictionary Source="Styles.xaml"/> 
    </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</UserControl.Resources> 

Dans Colors.xaml, je donne les résultats suivants:

Dans Colors.xaml

<GradientStopCollection x:Key="colorSchemeGradient"> 
<GradientStop Color="{Binding Scheme, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" Offset="0"/> 
<GradientStop Color="#000000" Offset="3"/> 
</GradientStopCollection> 

<LinearGradientBrush x:Key="colorBrush" StartPoint="0,0" EndPoint="0,1" GradientStops="{DynamicResource colorSchemeGradient}"/> 

La propriété dépendance Schéma de liaison aux la propriété de la couleur de la GradientStop fonctionne PARFAITEMENT, exactement comment je le veux. LinearGradientBrush utilise la couleur Scheme pour créer un dégradé qui va de la couleur du schéma à une nuance légèrement plus sombre. Le UserControl a un rectangle qui utilise le colorBrush comme arrière-plan. Tout fonctionne parfaitement, et j'aime ça.

Maintenant, les circonstances me font convertir ce UserControl à un CustomControl. Je fais cela en prenant le fichier XAML de mon UserControl et copiant à peu près tout son contenu dans Generic.xaml dans le modèle de contrôle. Après avoir essayé différentes choses, cela a semblé fonctionner assez bien pour déclarer mes dictionnaires de ressources en generic.xaml:

Dans generic.xaml

<Style TargetType="{x:Type local:MyCustomControl}"> 

    <!-- Style Resources --> 
    <Style.Resources> 

    <!-- Resource Dictionaries --> 
    <ResourceDictionary> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="/MyCustomControl;component/themes/Colors.xaml"/> 
     <ResourceDictionary Source="/MyCustomControl;component/themes/Styles.xaml"/> 
    </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 

    </Style.Resources> 

      . 
      . 
      . 
</Style> 

Maintenant, dans mon dossier de Colors.xaml, je ont les éléments suivants:

en Colors.xaml pour mon contrôle personnalisé

<GradientStopCollection x:Key="colorSchemeGradient"> 
<GradientStop Color="{Binding Path=Scheme, RelativeSource={RelativeSource FindAncestor, AncestorType=l:MyCustomControl}}" Offset="0"/> 
<GradientStop Color="#000000" Offset="3"/> 
</GradientStopCollection> 


<!-- FOR DEBUG PURPOSES --> 
<TextBlock x:Key="whoaText" Text="{Binding Path=Title, RelativeSource={RelativeSource FindAncestor, AncestorType=l:MyCustomControl}}"/> 

<LinearGradientBrush x:Key="colorBrush" StartPoint="0,0" EndPoint="0,1" GradientStops="{DynamicResource colorSchemeGradient}"/> 

Maintenant, pour une raison très frustrante que je ne peux pas comprendre, la liaison au GradientStop ne fonctionne plus. Il n'y a aucun problème dans la façon dont j'ai organisé mes ressources, parce que ce bloc de texte de débogage que j'ai fait lie à la propriété de dépendance de titre parfaitement. La couleur GradientStop ne lie pas à la propriété de dépendance Scheme et cela m'énerve.

Quelqu'un peut-il me dire ce qui se passe et comment je peux le réparer?

EDIT: J'ai reproduit mon problème dans un projet de test: http://www.megaupload.com/?d=0006XVYD

En Dictionary1.xaml regarder TextBlock avec x: touche "text2". ColorBrush utilise des arrêts de dégradé de colorSchemeGradient, qui utilise une liaison à Scheme. Mais cette liaison échoue et rien ne fonctionne. Si vous pouvez obtenir cette liaison de travail, vous êtes génial.

EDIT: Voici un contrôle utilisateur équivalent où les travaux de liaison: http://www.megaupload.com/?d=W13GTD4E

Pourquoi le travail de liaison ici et non dans le contrôle personnalisé?

Merci beaucoup,

Dalal

+0

Pouvez-vous s'il vous plaît ajouter un petit code, comme le XAML pour votre CustomControl afin que nous puissions voir clairement où la liaison échoue. {enjoy} –

+0

J'ai modifié mon post pour inclure un lien vers un projet de test pour un contrôle personnalisé où la liaison ne fonctionne pas, et j'ai également inclus un lien vers un contrôle utilisateur de test où la liaison fonctionne. Que se passe t-il ici? J'espère que vous aurez l'occasion de le vérifier. – Dalal

Répondre

3

Dans votre projet de test à http://megaupload.com/?d=0006XVYD, Vous semblez avoir DynamicResources où vous avez besoin statique, et les références à terme lorsqu'ils ne sont pas nécessaires.

En Dictionary1.xaml, modifiez le contenu à:

<!-- Color Scheme Gradient: Used in the label background and border brush. 
           SUBTLE gradient from the colorScheme color 
           to a slightly darker shade --> 
    <GradientStopCollection x:Key="colorSchemeGradient"> 
     <GradientStop Color="{Binding Path=Scheme, RelativeSource={RelativeSource FindAncestor, AncestorType=local:CustomControl1}}" Offset="0"/> 
     <GradientStop Color="#000000" Offset="3"/> 
    </GradientStopCollection> 

    <LinearGradientBrush x:Key="colorBrush" GradientStops="{StaticResource colorSchemeGradient}"/> 

    <TextBlock x:Key="text1" Text="{Binding Path=Name, RelativeSource={RelativeSource FindAncestor, AncestorType=local:CustomControl1}}" Foreground="Blue"/> 
    <TextBlock x:Key="text2" Text="This text doesn't show! Grr..." Foreground="{StaticResource colorBrush}"/> 

J'ai aussi changé les références TEXT1 et TEXT2 dans generic.xaml.

Notez le StaticResource plutôt que DynamicResource dans quelques endroits, ainsi que le réorganiser pour supprimer les références avant. Si vous lisez http://msdn.microsoft.com/en-us/library/ms750613.aspx, vous pouvez remarquer que le comportement de recherche dynamicresource est un peu différent de statique.

Notez que la mise à l'électricité statique ne tient pas le contrôle de répondre aux modifications apportées à la propriété Scheme - la recherche des ressources est statique, pas la valeur des propriétés dans ces ressources.

+0

J'ai changé toutes mes DynamicResources en StaticResources et cela fonctionne maintenant, merci. – Dalal