2010-03-05 18 views
5

Ich tauche gerade in WPF ein und finde das ein wenig merkwürdig und frustrierend für meinen Stil: Warum kann der Wert von etwas eine Ressource sein, aber du kannst den Wert nicht direkt auf das setzen, was die Ressource repräsentiert? Beispiel:Warum muss ich "Ressourcen" in WPF verwenden?

Dies gilt:

<ToggleButton> 
    <ToggleButton.Resources> 
     <Image x:Key="cancelImage" Source="cancel.png" /> 
    </ToggleButton.Resources> 
    <ToggleButton.Style> 
     <Style TargetType="{x:Type ToggleButton}"> 
      <Setter Property="Content" Value="{DynamicResource cancelImage}" /> 
     </Style> 
    </ToggleButton.Style> 
</ToggleButton> 

Aber das ist nicht:

<ToggleButton> 
    <ToggleButton.Style> 
     <Style TargetType="{x:Type ToggleButton}"> 
      <Setter Property="Content"> 
       <Setter.Value> 
        <Image Source="cancel.png" /> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </ToggleButton.Style> 
</ToggleButton> 

Was ist der Unterschied? Warum arbeiten beide nicht? Ich mag es nicht, für einige Dinge eine "Ressource" zu erstellen, weil es meinen Code aufteilt und das Lesen erschweren kann.

Und ja, ich mein Beispiel wissen kann wie diese

<ToggleButton> 
    <Image Source="cancel.png" /> 
</ToggleButton> 

vereinfacht werden, aber das ist nicht der Punkt.

+1

Warum ist das ein Comminity Wiki? – AnthonyWJones

+0

Also jede Fehlinformation, die ich gepostet habe, könnte bearbeitet werden. War das nicht richtig? – tyriker

Antwort

3

Beim Arbeiten mit Setter muss der Wert für den Setter die Fähigkeit unterstützen, "eingefroren" zu werden. Dies kann ein Werttyp sein (einschließlich Strukturen und Enums) oder eine Klasse, die von Freezable abgeleitet ist.

Es mag Ihrem ästhetischen Sinn nicht sehr helfen, aber es ist oft sauberer, alle Ressourcen oben im Abschnitt Ressourcen der Datei (oder ResourceDictionary) zu deklarieren, anstatt sie den Ressourcen eines individuellen Stils hinzuzufügen oder Kontrolle.

+0

Das hat mich für eine Weile gestolpert. Sobald Sie die Leistungsvorteile eines eingefrorenen Objekts erkannt haben, ist es sinnvoll, warum MS Werte für Setter als Freezable erzwingt. –

+0

Sie sagen also, indem Sie eine eine Ressource machen, ich friere es ein? Ansonsten habe ich möglicherweise die Möglichkeit, eine Eigenschaft der zur Laufzeit zu ändern, was eine Leistungsbelastung für das Layout/Zeichnungs-Subsystem darstellt. Ist das der Kern davon? – tyriker

+1

Nein, es wird nicht eingefroren, die StaticResource ist das Element im Setter, das eingefroren ist. Wenn der visuelle Baum der Vorlage erstellt wird, kann er das nicht eingefrorene Image-Element finden. Da Image nicht von Freezable abgeleitet ist, kann es leider nicht eingefroren werden, weshalb Sie es nicht in einem Setter verwenden können. –

Verwandte Themen