2017-12-29 59 views
0

Ich arbeite an einer wiederverwendbaren Vorlage für ein WPF ComboBox. Ich bin in der Lage, dynamisch die Schriftfarbe zu ändern, den Hintergrund und Grenze durch diese Verweise in der Vorlage:C# WPF XAML RelativeSource Verweis auf ComboBox.Resources Element

Foreground="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ComboBox}, Path=Foreground}" 
BorderBrush="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ComboBox}, Path=BorderBrush}" 
Background="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ComboBox}, Path=Background}" 

Diese einfach waren, da ich Eigenschaften hatte ich verweisen konnte.

<ComboBox Margin="90,62,0,0" Height="26" Width="302" 
      HorizontalAlignment="Left" VerticalAlignment="Top" 
      Focusable="False" IsReadOnly="True" MaxDropDownHeight="202" 
      Foreground="White" Background="SteelBlue" BorderBrush="White" 
      Style="{StaticResource ComboBoxFlatStyle}" 
      ItemContainerStyle="{StaticResource ComboBoxItemFlatStyle}"> 

Was würde ich tun möchte, ist der Verweis auf eine ähnliche Weise folgende:

<ComboBox.Resources> 
    <SolidColorBrush x:Key="ComboBoxHighlightBrush" Color="RoyalBlue" /> 
</ComboBox.Resources> 

Ist es möglich, eine Ressource innerhalb der Steuerung zu verweisen? Ich möchte wirklich diese Vorlage auf einem anderen ComboBox mit unterschiedlichen Farben verwenden können.

+0

Foreground = "{StaticResource ComboBoxHighlightBrush}" funktioniert auf alles in Ihrer Combobox, haben Sie das gemeint? – Milan

+0

@Milan Nein, ich habe einen Stil in meinen Anwendungsressourcen. –

+0

Foreground = "{DynamicResource ComboBoxHighlightBrush}" funktioniert, wenn Ihr Pinsel in app.xaml-Ressourcen definiert ist. Ich bekomme jetzt, dass Sie tatsächlich auf eine Ressource zugreifen möchten, die nicht innerhalb Ihrer Anwendungsressourcen, sondern in einer Combobox innerhalb Ihrer Anwendungsressourcen ist. Aber ist das nicht ein Zeichen dafür, dass Sie wirklich wollen, dass dieser Pinsel global zugänglich ist? – Milan

Antwort

0

Ich war ziemlich sicher, dass die Antwort nein war, aber dann sind ControlTemplates zur Laufzeit an die Eigenschaften des Zieltyps gebunden, richtig? Also dachte ich, solange "Resources" eine zugängliche Eigenschaft des ComboBox-Objekts ist, sollte es zur Laufzeit einen Weg geben. Ich überprüfte snoop mit, dass „Ressourcen“ war in der Tat eine lesbare Eigenschaft zur Laufzeit:

enter image description here

Da Ressourcen ist nur ein Wörterbuch, ich habe dann versucht, auf eine Ressource den Hintergrund der Combobox Dropdown-Liste gesetzt genau definiert die gleiche Art und Weise, wie Sie durch das Hinzufügen dieser Attribute zu dem „DropdownBorder“ Element in der Standard-ComboBox-Steuerelement Vorlage tat

Background="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Resources[ComboBoxHighlightBrush]}" 

Dies wird Ihnen wahrscheinlich eine Kompilierung Fehler, die besagt, dass „Ressourcen“ nicht zugänglich ist - aber es ist kein Fehler, der dich wirklich davon abhält, das zu bauen Die Lösung und das Ausführen. Zur Laufzeit werden Sie sehen, dass es tatsächlich funktioniert!

Obwohl es funktioniert, ich bin mir nicht sicher, ob dies der beste Weg ist, um Ihre Vorlage wiederverwendbar zu machen. Abgesehen von dem lästigen Fehler bei der Kompilierung muss ein Konsument der Vorlage über diese magische Zeichenfolge Bescheid wissen, um dem Ressourcenwörterbuch einen korrekt codierten Pinsel hinzuzufügen.

ich folgendes in Betracht ziehen würden:

  1. Ein üblicher Weg, um leicht hinzufügen, um das Verhalten eines bestehenden UI-Steuerelement ist angebracht Eigenschaften verwendet. Sie können an angefügte Eigenschaften in ControlTemplates binden. Auf diese Weise haben Sie etwas eingegeben und nicht auf eine magische Zeichenfolge angewiesen.
  2. Erstellen Sie ein vollständiges benutzerdefiniertes Steuerelement. In meinem UI-Projekt muss ich oft einen Standardtext oder ein angedocktes Element oben in der Combobox-Dropdownliste haben. Daher habe ich ein benutzerdefiniertes Steuerelement erstellt, das zusätzliche Abhängigkeitseigenschaften bietet, die diese Features ermöglichen, aber auch Farben ändern können WPF ComboBox lässt mich nicht aus der Box.

bearbeiten auf Code-Basis, ich glaube, meine Interpretation Ihrer Frage mit Control .. richtig ist, wenn nicht die oben nicht sinnvoll.Wenn ja, möchte ich Sie sollten auch erwähnen, wahrscheinlich Bindungen tun wie

Foreground="{TemplateBinding Foreground}" 

statt

Foreground="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ComboBox}, Path=Foreground}" 

Wenn etwas nur für das Lesen zu vereinfachen. Es ist auch eine schnellere Bindung.

+0

Nur getestet und ich hatte tatsächlich keine Compilerfehler. Für mich funktioniert das sehr gut, da ich die einzige Person bin, die diese Vorlage verwendet. Vielen Dank! –

+0

Huh, du hast recht, die anfängliche "Ressourcen sind nicht zugänglich" verschwand kurz nachdem ich es gebaut habe. Ich denke, ich bin zu einer Schlussfolgerung gelangt, da ich an die zufälligen Nicht-wirklich-Fehler-Fehler von WPF gewöhnt bin. :) – Rowbear

Verwandte Themen