2013-02-13 14 views
7

Ich habe ein Button-Steuerelement als Ressource in den Ressourcen Wörterbuch als unten:WPF-Steuerelemente als StaticResource im Ressourcenwörterbuch, die in mehreren WPF-Windows verwendet werden?

<!--ButtonResources.xaml file--> 
<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Button x:Key="buttonResource" Content={Binding BoundText}/> 
</ResourceDictionary> 
<!--ButtonResources.xaml file--> 

ich jetzt diese über Tastensteuerung Zum Inhalt Eigenschaft Content steuert in 2 verschiedene Windows-XAML-Dateien gebunden verwenden, in denen jeweils Window hat seine eigene DataContext und daher sollte jedes Fenster die Content der oben genannten Tastensteuerung basierend auf seinem ViewModel'sBoundText Eigenschaftswert wie unten für jedes Fenster anzeigen.

<Window x:Class="TestClass1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Window.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="ButtonResources.xaml"/> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Window.Resources> 
    <Grid> 
     <ContentControl Content={StaticResource buttonResource}/> 
    </Grid> 
</Window> 

Aber das Problem ist, dass sowohl Display des Fensters desselben Wert für den Boundtext Eigenschaft, die bedeutet, dass sowohl die WPF Windows-gleiche Instanz von Tasten-Steuerung von Ressourcen, sowohl in der Windows verwendet.

Wie kann ich dieses Problem so lösen, dass jedes Fenster eine separate Tasten-Steuerung von der Ressource erhält und zeige noch verschiedene Werte für die BoundText Eigenschaft von ihrem eigenen Ansichtsmodell?

Edit: Für die, wie unten in MSDN genannten Grund kann ich nicht x verwenden:

• Die Resource, die die Elemente enthält, muss nicht: Geteilt = "False" Attribut dieses Problem zu beheben verschachtelt sein in einem anderen ResourceDictionary. Beispielsweise können Sie nicht verwenden x: Für Elemente in einem ResourceDictionary freigegeben, das in einem Style ist, das bereits ein ResourceDictionary-Element ist.

Antwort

8

Haben Sie versucht, das x:Shared Attribut zu benutzen?

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Button x:Shared="False" x:Key="buttonResource" Content={Binding BoundText}/> 
</ResourceDictionary> 

Für weitere Informationen lesen here.

Falls dies nicht funktioniert, können Sie eine Vorlage in Ihrer Ressource anstelle der Schaltfläche speichern und ein ContentControl in Ihrem Fenster verwenden, um es anzuzeigen.

+0

Danke.Aber ich kann dieses Attribut nicht als Grund verwenden, der in meinem ** Edit: ** - Teil der Frage erwähnt wird. – VS1

+0

Und Sie verwenden das obige Beispiel, das Sie das folgende Tag verwenden würden. Loman

+0

Excellent, x: Shared hat gerade mein Problem gelöst, um ein Control unter verschiedenen Views zu teilen. – usefulBee

3

Versuchen:

<Style TargetType="Button" x:Key="buttonResource"> 
    <Setter Property="Content" Value="{Binding BoundText}" /> 
</Style>


<Button Style="{StaticResource buttonResource}" /> 
+0

Danke. Ich habe meine Frage aktualisiert, um die Verwendung von Content Control einzuschließen. Wie verbinde ich das ContentControl in jedem WPF-Fenster (.xaml) mit der Button-Ressource im Ressourcenwörterbuch gemäß obiger Antwort? – VS1

+0

Ich sehe nicht, wie das anders wäre. Können Sie den Code Ihres ContentControls posten? – KBoek

+0

Ich habe den Code für die Verwendung von ContentControl in beiden Window.xaml-Dateien hinzugefügt. Die tatsächliche Verwendung ist nicht von einer Schaltfläche, sondern ein anderes Steuerelement und es, weil wir die Ressource XAML-Datei in zukünftigen Versionen ändern möchten, ohne das Fenster zu ändern. xaml file code ... – VS1