2012-06-22 9 views
12

Ho creato un assembly di libreria di classi in cui ho creato controlli personalizzati e ho definito gli stili predefiniti nel file generic.xaml.Gli stili da generic.xaml non vengono applicati

Sembra che questo sia un problema abbastanza comune, a condizione che molte persone lo pubblichino. Tuttavia non sono riuscito a trovare alcuna risposta utile per il mio caso.

  • il generic.xaml si trova nella cartella Temi.
  • il file generx.xaml Build Action è impostato su Page.
  • il ThemeInfo è correttamente definito nel mio AssemblyInfo.cs.

Nella mia applicazione di test, se mi fondo manualmente il file generic.xaml dai miei controlli personalizzati assembly nella applicazione di file App.xaml come questo:

<Application.Resources> 
    <ResourceDictionary> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="/MyControlsAssembly;component/Themes/generic.xaml"/> 
    </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

poi i controlli personalizzati sono correttamente a tema, ma se non unisco manualmente il generic.xaml, i controlli vengono visualizzati con il tema predefinito di Windows.

Potrebbe dirmi per favore cosa sto dimenticando e/o facendo di sbagliato?

Ulteriori informazioni:

    attributo di assembly
  • mio ThemeInfo è definito come segue:

    [assembly: ThemeInfo(ResourceDictionaryLocation.SourceAssembly, ResourceDictionaryLocation.SourceAssembly)]

    (Nota: il risultato è lo stesso con qualsiasi combinazione di parametri per l'attributo ThemeInfo

  • Ci sono altri due file .xaml accanto al file generic.xaml nella cartella Temi.

  • C'è una sottocartella nella cartella Temi che contiene un altro file .xaml.
+4

Do hai ancora DefaultStyleKeyProperty impostato in un costruttore statico sui tuoi controlli personalizzati? – Nogusta

+0

Hai avuto fortuna a capirlo? Ho quasi la stessa identica cosa in corso con il mio gruppo di controlli personalizzati. Se aggiungo un riferimento in App.config al file generic.xaml, i controlli sono a tema. Se lo lascio fuori non ottengo niente. –

+0

Questo link è valido? http://social.msdn.microsoft.com/Forums/vstudio/en-US/2e1fb162-e828-4fd9-832f-d2791c1980b4/isnt-genericxaml-supposed-to-loaded-automatically Ho affrontato lo stesso problema, e penso che questa sia la causa principale –

risposta

7

è necessario la seguente riga nel costruttore controllo personalizzato:

public class MyCustomControl : Control 
{ 
    static MyCustomControl() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(MyCustomControl), new FrameworkPropertyMetadata(typeof(MyCustomControl))); 
    } 
} 

Poi, se si dispone di un file all'interno della cartella generic.xaml temi, con il seguente stile di esempio:

<Style TargetType="{x:Type local:MyCustomControl}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:MyCustomControl}"> 
       <Border> 
        <Label>Testing...</Label> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Ora lo stile verrà automaticamente applicato senza ulteriori fusioni.

+0

Questo non funziona per me. Guarda il mio commento sulla domanda iniziale – bigfoot

+0

Inizia con una soluzione vuota e vedi se riesci a farlo funzionare da lì? – Eternal21

+0

Questo è quello che sto facendo. Sono derivato da Xceed Data Grid. Se creo un nuovo MyControl: Control o MyButton: Button, funziona. Forse è il supporto per i temi Xceed che entra in gioco qui, e ho bisogno di esaminare i loro tutorial sui temi, o semplicemente accettare il dizionario di unione nella mia applicazione. A meno che non sorgano altre idee. – bigfoot

3

Per applicare gli stili predefiniti in Temi \ Generico.xaml nella mia libreria di controlli personalizzati, ho deciso di cercare l'ispirazione da una libreria di controlli open source consolidata (MahApps). Questo progetto ti offre un ottimo esempio di come strutturare e impaginare una libreria di controlli personalizzati.

tagliare una lunga storia breve, per ottenere i vostri stili predefiniti in Themes \ generic.xaml è necessario includere quanto segue nel file AssemblyInfo.cs nella vostra abitudine controlla libreria:

[assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)] 

Nel mio caso, la mia custom controlla AssemblyInfo.cs sembrava qualcosa di simile:

using System.Runtime.InteropServices; 
using System.Windows; 
using System.Windows.Markup; 

[assembly: AssemblyCopyright("...")] 
[assembly: ComVisible(false)] 

[assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)] 

[assembly: AssemblyVersion("1.0.0.0")] 
[assembly: AssemblyFileVersion("1.0.0.0")] 
[assembly: AssemblyInformationalVersion("1.0.0.0")] 
[assembly: AssemblyTitleAttribute("...")] 
[assembly: AssemblyDescriptionAttribute("")] 
[assembly: AssemblyProductAttribute("...")] 
[assembly: AssemblyCompany("...")] 
0

Non sono sicuro se questo funziona in WPF, ma funziona per me in Silverlight:

Costruttore:

public class MyCustomControl : Control 
{ 
    static MyCustomControl() 
    { 
     this.Style = (Style)Application.Current.Resources["MyCustomControlStyle"]; 
    } 
} 

Stile:

<Style x:Key="MyCustomControlStyle" TargetType="{local:MyCustomControl}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{local:MyCustomControl}"> 
       <Border> 
        <Label>Testing...</Label> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style>