2013-02-13 9 views
7

Ho un controllo Button come risorsa nel dizionario di risorse, come di seguito:Controlli WPF come risorsa statica nel dizionario delle risorse, utilizzato in più finestre WPF?

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

Io uso questo pulsante sopra legata al contenuto di proprietà di ContentControl controlla in 2 diverse di Windows file XAML in cui ogni Window ha il proprio DataContext e pertanto ciascuna finestra deve visualizzare Content del controllo pulsante in alto in base al suo valore di proprietà ViewModel'sBoundText come di seguito per ciascuna finestra.

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

Ma, il problema è che mostra lo stesso valore sia della finestra per la proprietà BoundText il che significa che sia il WPF di Windows hanno stesso istanza di controllo Button dalla risorsa, utilizzato sia in Windows.

Come posso risolvere questo problema in modo tale che ogni finestra ottiene un separato controllo tasto dalla risorsa e ancora visualizzare diversi valori per la proprietà BoundText dal loro proprio ViewModel?

Edit: Per il motivo di cui al MSDN come sotto, non posso usare x: Shared = "false" attributo per risolvere questo:

• Il ResourceDictionary che contiene gli elementi non deve essere nidificato all'interno di un altro ResourceDictionary. Ad esempio, non è possibile utilizzare x: condiviso per elementi in un ResourceDictionary all'interno di uno stile che è già un elemento ResourceDictionary.

risposta

8

Hai provato a utilizzare l'attributo x:Shared?

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

Per maggiori informazioni leggere here.

Nel caso in cui questo non funzioni, è possibile memorizzare un modello nella risorsa, anziché il pulsante e utilizzare un ContentControl all'interno della finestra per visualizzarlo.

+0

Grazie.Ma, non posso usare quell'attributo come ragione menzionata nel mio ** Modifica: ** parte della domanda. – VS1

+0

E tu usi l'esempio sopra, useresti il ​​seguente tag. Loman

+0

Eccellente, x: condiviso ha appena risolto il problema anche con lo scopo di condividere un controllo tra diverse viste. – usefulBee

3

Prova:

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


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

Grazie. Ho aggiornato la mia domanda per includere l'uso di Content Control, come legare ContentControl in ogni finestra WPF (.xaml) alla risorsa Button nel dizionario risorse come da risposta sopra? – VS1

+0

Non vedo come sarebbe diverso. Puoi pubblicare il codice di ContentControl? – KBoek

+0

Ho aggiunto il codice per l'utilizzo di ContentControl in entrambi i file Window.xaml. L'utilizzo effettivo non è di un pulsante ma di un controllo diverso ed è perché vogliamo modificare il file xaml della risorsa nelle versioni future senza dover modificare la finestra. xaml file code ... – VS1

Problemi correlati