2010-04-20 3 views
12

Ho un WPF ResourceDictionary con il seguente TextBlock:Qual è lo scopo di StaticResource all'interno di WPF ResourceDictionary?

<TextBlock Visibility="{Binding Converter={StaticResource MyBoolProp ResourceKey=BoolToVis}}"> 
</TextBlock> 

Il ResourceDictionary è incluso nel App.xaml sotto MergedDictionaries:

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="MyResourceDictionary.xaml"/> 

All'interno del App.xaml ho definito il convertitore BoolToVis (di nuovo , sotto Application.Resources)

<BooleanToVisibilityConverter x:Key="BoolToVis" /> 

quando inizio la mia app up - ricevo il seguente XamlParseExcep zione:

"Fornire valore 'System.Windows.Markup.StaticResourceHolder' ha generato un'eccezione."

L'InnerException è:

"Non riesci a trovare risorsa denominata 'BoolToVis' I nomi delle risorse sono maiuscole e minuscole.".

sono in grado di fare riferimento a questo convertitore direttamente con App.xaml (infatti, il particolare dichiarazione XAML è identico) sia in altre UserControls senza problemi.

Questo particolare bit di codice ha funzionato bene anche con .NET 4.0 RC (e Beta2). Questo errore si è verificato solo quando ho eseguito l'aggiornamento a .NET 4.0 RTM.

sono in grado di lavorare intorno ad esso dichiarando un'altra BooleanToVisibilityConverter all'interno MyResourceDictionary.xaml e facendo riferimento in questo modo:

<TextBlock Visibility="{Binding Converter={StaticResource MyBoolProp ResourceKey=BoolToVis2}}"> 
</TextBlock> 

Qual è il motivo per cui dovrei bisogno di fare questo?

risposta

8

Per MSDN:

risorse in un dizionario unito occupano una posizione nel campo di applicazione di ricerca risorsa che è subito dopo il campo di applicazione del dizionario principale risorsa sono fuse in.

Le risorse definite in App.xaml non possono essere viste da un ResourceDictionary unito. Penso che abbia più senso definire un convertitore utilizzato in un ResourceDictionary nel ResourceDictionary stesso o in un altro ResourceDictionary che ospita tutti i tuoi convertitori.

+1

Prenderemo probabilmente la seconda via. Quello che è così bizzarro è che questo codice ha funzionato bene nella RC, ma non in RTM. Il nostro team di sviluppo è "misto" per quanto riguarda chi ha quale versione. Come early adopter, ho disegnato la cannuccia breve :). Grazie! –