2009-05-31 4 views
4

Ich verwende das MV-VM-Muster in WPF, und ich habe einen Hintergrundpinsel, den ich ziemlich oft verwenden werde, und ich möchte es in verschieben ein gemeinsames ResourceDictionary.Aktivieren Sie die Datenbindung in freigegebenen WPF-Ressourcen in einem ResourceDictionary

Das einzige Problem ist, dass der Pinsel eine Farbe verwendet, die er über Databinding in seinen gehosteten Kontext bekommt.

Gibt es trotzdem ich kann den Pinsel in ein ResourceDictionary bewegen und immer noch den Wert finden, den es braucht?

Bürste:

<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> 

Nachdem es heraus zu einem Resource Refactoring und Hinzufügen eines Schlüssels, rief ich sie als solche:

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

Aber dies führte in dieser Ausgabe im Debugger :

System.Windows.Data Fehler: 2: Kann nicht finden, FrameworkElement oder FrameworkContentElement für Zielelement. BindingExpression: Pfad = Hintergrundfarbe; Datenelement = null; Zielelement ist 'GradientStop' (HashCode = 16001149); Zieleigenschaft ist 'Farbe' (Typ 'Farbe')

Antwort

3

Ich glaube nicht, dass Sie diese Brush in Ihrem Ressourcenwörterbuch behalten und Binding verwenden können, um die Farbe zu ziehen. Da der Pinsel nur einmal erstellt wird (weshalb Sie ihn im Ressourcenwörterbuch an erster Stelle haben wollen), weiß WPF zum Zeitpunkt der Erstellung nicht, wo er verwendet wird, daher kann er den Wert nicht einlesen die Farbe.

Wenn die Farbe zum Beispiel in Settings beibehalten würde, würde das wahrscheinlich funktionieren - aber ich schätze, das hilft Ihnen nicht, weil Sie wahrscheinlich die Farbe auf jedem Steuerelement ändern möchten, auf dem es verwendet wird (andernfalls , du könntest einfach die Farbe hart codieren oder es wäre schon in den Einstellungen).

Vielleicht könnten Sie eine RadialGradientBrush Unterklasse erstellen und die erste GradientStop Farbe als DependencyProperty? Sie können dann eine Instanz dieser Unterklasse erstellen, wo immer Sie sie benötigen, und Binding verwenden, um dort die richtige Farbe zu ziehen.

0

Dies ist ein wenig spät, aber einen Blick ein StaticResource oder eine DynamicResource anstelle eines Binding bei Verwendung - es erlaubt Ihnen, eine andere Ressource zugreifen. Nicht ganz Binding, aber es ist besser als nichts.

+0

Das klingt wie es könnte funktionieren, wenn ich einen Aufruf von DynamicResource verwendet ... dann in der Eigenschaft StackPanels.Resources vielleicht angegeben? Ich werde testen und sehen, was ich finden kann. Nie zu spät, um eine Frage zu SO zu beantworten! – Nidonocu

Verwandte Themen