2009-05-31 6 views
4

J'utilise le modèle MV-VM dans WPF et j'ai un pinceau d'arrière-plan que je vais utiliser assez souvent et je voudrais le déplacer vers un ResourceDictionary partagé.Activer la liaison de données dans les ressources WPF partagées à l'intérieur d'un ResourceDictionary

Le seul problème est que le pinceau utilise une couleur qu'il obtient via la liaison de données à son contexte hébergé.

Y at-il de toute façon que je puisse déplacer le pinceau dans un ResourceDictionary tout en lui trouvant la valeur dont il a besoin?

Le pinceau:

<RadialGradientBrush> 
    <RadialGradientBrush.RelativeTransform> 
     <TransformGroup> 
      <ScaleTransform CenterX="0.5" 
          CenterY="0.5" 
          ScaleX="2.3" 
          ScaleY="2.3" /> 
      <TranslateTransform X="-0.3" 
           Y="-0.3" /> 
     </TransformGroup> 
    </RadialGradientBrush.RelativeTransform> 
    <GradientStop Color="{Binding Path=BackdropColor}" 
        Offset="1.2" /> 
    <GradientStop Color="#FFFFFFFF" 
        Offset="-0.1" /> 
</RadialGradientBrush> 

Après réusinage vers un ResourceDictionary et en ajoutant une touche, je l'ai appelé en tant que tel:

<StackPanel Grid.Row="0" 
      Margin="0,0,0,0" 
      Orientation="Horizontal" 
      Background="{DynamicResource BackdropRadGradBrush}"> 

Mais cela a donné lieu à cette sortie dans le débogueur :

System.Windows.Data Erreur: 2: Impossible de trouver la règle FrameworkElement ou FrameworkContentElement pour l'élément cible. BindingExpression: Path = BackdropColor; DataItem = null; l'élément cible est 'GradientStop' (HashCode = 16001149); La propriété target est 'Color' (type 'Color')

Répondre

3

Je ne pense pas que vous puissiez conserver ce Brush dans votre dictionnaire de ressources et utiliser la liaison pour tirer la couleur. Comme le pinceau n'est créé qu'une seule fois (ce qui explique pourquoi vous le souhaitez dans le dictionnaire de ressources), au moment de la création, WPF ne sait pas où il sera utilisé. Il ne peut donc pas extraire la valeur de la couleur. Si la couleur était conservée dans Setings, par exemple, cela fonctionnerait probablement - mais je suppose que cela ne vous aidera pas, car vous voudrez probablement que la couleur change sur chaque commande sur laquelle elle est utilisée (sinon , vous pourriez simplement coder la couleur ou il serait déjà dans les paramètres).

Peut-être que vous pouvez créer une sous-classe RadialGradientBrush, et d'exposer la première couleur GradientStop comme DependencyProperty? Vous pouvez ensuite créer une instance de cette sous-classe là où vous en avez besoin et utiliser la liaison pour y insérer la couleur correcte.

0

Ceci est un peu en retard, mais jetez un oeil à l'aide d'un StaticResource ou DynamicResource au lieu d'un Binding - il vous permettra d'accéder à une autre ressource. Pas tout à fait Binding, mais c'est mieux que rien.

+0

Cela semble fonctionner si j'utilise un appel DynamicResource ... puis spécifié dans la propriété StackPanels.Resources peut-être? Je vais tester et voir ce que je peux trouver. Il n'est jamais trop tard pour répondre à une question sur SO! – Nidonocu

Questions connexes