2012-11-01 7 views
7

ho mantenere le risorse della mia app in una DLL separata e di riferimento nel mio EXE principale utilizzando qualcosa di simile in App.xaml: -WPF unisce i dizionari delle risorse in ogni controllo utente: cattiva idea?

<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="pack://application:,,,/MyThemesAssembly;component/Themes/Generic.xaml"/> 
</ResourceDictionary.MergedDictionaries> 

Quando modifico una finestra che è nel progetto EXE principale, il progettista VS2010 non riconosce alcuna risorsa dall'assieme, quindi non vedo alcuno stile applicato (in realtà non è un problema visto che lavoro sempre nella vista XAML). Tuttavia, Resharper non riconosce questi nomi di risorse esterne, risultando in un sacco di scarabocchi sotto nomi di risorse quando sto modificando XAML.

Ho scoperto che è possibile correggere sia la progettazione VS che il Resharper includendo il suddetto XAML in ogni finestra e controllo utente, ma questo avrà un effetto negativo sulla memoria e/o sulle prestazioni? Ogni finestra riceverà una copia separata delle risorse?

+0

Bene, i bug nell'IDE e gli strumenti non dovrebbero influenzare il codice. Inoltre, includere il dizionario delle risorse in ogni singolo controllo è un modo incline agli errori (cosa succede se decidi di rinominare il dizionario? Per aggiungerne un altro?). – Vlad

+0

Vorrei comunque provare ad aggiungere una stranezza al problema in modalità progettazione. (Forse questo aiuterà: 'public class MyUserControlBase: UserControl {public MyUserControlBase() {if (DesignerProperties.GetIsInDesignMode (this)) LoadExternalDictionariesExplicitlyHere(); ...') – Vlad

+1

@Vlad Ho imparato a convivere con gli scarabocchi - questo approccio di fissaggio di Resharper è davvero solo un "bello da avere". Non penso che la ridenominazione/aggiunta di risorse sarebbe un problema - nel mio esempio XAML sopra, "Generic.xaml" si fonde solo un carico di altre risorse in quell'assembly, quindi è facile aggiungerne di nuove. Sono più preoccupato se includere in ogni finestra farà esplodere la memoria/le prestazioni dell'app (o VS2010). –

risposta

2

Provare a utilizzare VS2012.

Ho un progetto di prova che stavo usando che stavo facendo dizionario risorse fusione da un assembly esterno e nel mio app.xaml ho questo:

<Application x:Class="WpfPackDictionaries.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      StartupUri="MainWindow.xaml"> 
    <Application.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="pack://application:,,,/WPFCommonLibrary;component/Vectors/Vectors.xaml"/> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Application.Resources> 
</Application> 

Poi nel mio MainWindow.xaml ho questo dove il sentiero tira in ModifiablePathStyle stile:

<Window xmlns:Control="clr-namespace:WPF.Common.Control;assembly=WPFCommonLibrary" x:Class="WpfPackDictionaries.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 

    <Grid> 
     <Path Style="{StaticResource ModifiablePathStyle}" Fill="Red"/> 
     <Control:Jabberwocky /> 
    </Grid> 
</Window> 

Intellisense/ReSharper (V7.1 10/31 (Early Corporatura Access)) riconosce lo stile e non ho squigglies:

enter image description here

Quindi hai provato a lavorare su VS2012?

+0

Alla fine ci sposteremo su VS2012, ma stiamo ancora aspettando la gestione da $ $! –

+0

@AndrewStephens Tutto il lavoro migliore viene svolto in rispetto della gestione. ;-) – OmegaMan

+0

@AndrewStephens Usa l'edizione VS2012 Express per il tuo lavoro xaml. Può ancora compilare progetti .Net 3.5/4.0 senza modificare i progetti .prj o .sln. – OmegaMan

3

Abbiamo riscontrato un problema nella nostra applicazione con l'uso di ResourceDictionaries a cui si fa riferimento in ogni UserControl/View. Io sconsiglio questo. Siamo riusciti a ridurre il footprint di memoria della nostra applicazione di 300 mb grazie all'uso di SharedResourceDictionaries. Mi sembra che si finirà con il fatto che il ResourceDictionary viene istanziato una volta per ogni singolo UserControl nella propria applicazione. Non farlo solo per riparare VS designer.

2

VS2012 è in grado di "vedere" le risorse poiché il progettista VS XAML carica ed esegue il codice in fase di progettazione, pertanto VS può ispezionare quali risorse saranno disponibili in fase di esecuzione. ReSharper non utilizza mai l'esecuzione del codice in fase di progettazione (poiché ciò richiede che il codice sia sempre in stato compilabile), pertanto il supporto XAML è diventato un compito un po 'più complesso.

ReSharper 8.0 ha implementato il supporto per la decompilazione di BAML ed estrae l'elenco di file XAML e risolve le risorse XAML dagli assiemi binari di riferimento.

Problemi correlati