Domanda

Ho due biblioteche e un unico layout di montaggio la domanda e mi chiedo come posso riferire stili da loro chiave in una delle mie librerie che è definita dell'altro.

Il mio layout di soluzione:

  • WpfControls.dll - Contiene controlli riutilizzabili generici come ad esempio un controllo WPF basato NumericUpDown, nonché altri controlli di base e alcuni stili come bene che vorrei fare riutilizzabile. Per il bene di questo esempio consente di dire la mia chiave di stile qui è definito come MyButtonStyle .
  • SpecializedControls.dll - Contiene i controlli che sono specializzati alla nostra applicazione come i controlli compositi personalizzati e controlli utente in WPF. Questo è dove mi piacerebbe fare riferimento al MyButtonStyle stile definito in WpfControls.dll assemblaggio.
  • Application.exe -. Questo utilizza assemblaggio controlli definiti nel SpecializedControls.dll assemblaggio

Ho visto alcuni esempi che spiegano come fare questo con una semplice libreria di controllo unico e l'applicazione di montaggio, ma nel mio caso ho due assemblee e un'applicazione. Quindi, in altre parole nel mio caso non ho un App.xaml nella mia biblioteca secondo controllo dove ho potuto utilizzare il concetto MergeDictionaries. Sono abbastanza sicuro che se avessi voluto avrei potuto mettere un MergedDictionaries riferimento direttamente in ogni file XAML controlli per unire tutti generic.xaml definito in WpfControls.dll assemblaggio ma la mia ipotesi è che questo si tradurrebbe in stili di essere ridondante incorporata in vari luoghi nei miei SpecializedControls di montaggio, che non sembra la soluzione migliore. A peggiorare le cose, questi dizionari potrebbero anche essere fuse in Application.exe così, fa questo comincia a gonfiare la mia applicazione in fase di esecuzione?

Qualcuno può chiarire ciò che la raccomandata o approccio migliore per la condivisione di tali stili con la minor quantità di overhead programtic e di risorse.

Aggiorna : Dopo un po 'di più test sembra che sto avendo problemi riferimento a qualsiasi risorsa definita all'interno generic.xaml da essa la chiave anche all'interno della stessa assemblea. Ci può essere qualcosa di totalmente sbagliato su come sto capire come chiavi di risorse funzionano così dovrò un po 'più di ricerca, nonché esaminando ComponentResourceKey. Se qualcuno ha qualche suggerimento o suggerimenti si prega di aiuto.

È stato utile?

Soluzione

Resource ricerca in WPF lavora in una gerarchia:. L'albero logica, poi risorse applicative, le risorse a tema e, infine, le risorse di sistema

risorse a tema di solito possono essere raggiunte solo in modo implicito (anche all'interno del gruppo sono definiti). Questo è rilevante solo per gli stili, in cui il TargetType può essere utilizzato come chiave implicito.

Per realizzare quello che stai cercando di fare, ci sono due opzioni:

  • Con un ComponentResourceKey . Questa è una chiave risorsa speciale che permette di risorse fanno riferimento da altri assembly. Ad esempio, è possibile definire un pennello in WpfControls dizionario tema:

    <LinearGradientBrush x:Key="{ComponentResourceKey TypeInTargetAssembly=local:MyClass, ResourceId=MyBrush}">
        <GradientStop Color="Red" />
        <GradientStop Color="Blue" Offset="1" />
    </LinearGradientBrush>
    

    E poi si può fare riferimento in SpecializedControls :

    <UserControl Background="{StaticResource {ComponentResourceKey TypeInTargetAssembly=wpfControls:MyClass, ResourceId=MyBrush}}" />
    
  • Usa MergedDictionaries per importare un dizionario nelle risorse dell'applicazione. È possibile farlo nel Application di montaggio, e quando l'applicazione carica, anche i controlli che sono in SpecializedControls sarebbero in grado di utilizzare queste risorse. Si avrà un problema con l'esperienza di progettazione in questo scenario, che si può risolvere mettendo un falso App.xaml in SpecializedControls , che sarebbe anche un riferimento al dizionario.

Spero che questo aiuti,

Aelij.

Altri suggerimenti

La risposta accettata è corretta, sto solo spiegando come utilizzare MergedDictionaries

Nel App.xaml ,

    <Application.Resources>
      <ResourceDictionary>
         <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/-YourDllName-;component/-DirectoryName-/FileName.xaml"/>
            <!-- Use Below syntax if your resource file is not inside a directory(in root) -->
            <ResourceDictionary Source="pack://application:,,,/-YourDllName-;component/FileName.xaml"/>
         </ResourceDictionary.MergedDictionaries>
      </ResourceDictionary>
    </Application.Resources>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top