WPF Style in external assembly

Gestendo un progetto WPF abbastanza complesso, mi sono scontrato con la necessita’ di avere una serie di Style e Template globali per tutti gli elementi grafici della mia applicazione, da centralizzare in un unico assembly e da referenziare poi nei vari progetti che compongono la mia soluzione.

Ho risolto usando dei ResourceDictionary dove immagazzinare queste risorse e usando delle Pack URI per referenziare questi dizionari nei vari progetti.

Qualche info su come spostare uno style dal singolo elemento fino ad un livello condiviso da tutta l’applicazione (il ResourceDictionary): Styles in WPF (2) – Styles, Resources and ResourceDictionaries.

Per avere un’idea un po’ piu’ approfondita sulle Pack URI: Pack URIs in Windows Presentation Foundation.

 

CREARE L’ASSEMBLY CON LE RISORSE CONDIVISE

Dato che nell’assembly andranno a finire alcuni controlli WPF personalizzati, ho aggiunto alla soluzione corrente un nuovo progetto di tipo WPF Custom Control Library, chiamandolo MyTestProject.WPF.Global.

Ho poi creato una cartella Styles (nome arbitrario) e all’interno di questa cartella ho aggiunto un nuovo item di tipo Resource Dictionary (WPF), con nome GlobalStyles.xaml. In questo file xaml ho caricato i miei stili globali, ad esempio aggiungendo qualcosa tipo:


<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Style x:Key="CellTextStyle">
        <Setter Property="TextElement.FontSize" Value="12" />
        <Setter Property="TextElement.FontWeight" Value="Bold" />
    </Style>
</ResourceDictionary>

Ora, se voglio usare questo stile all’interno di un controllo personalizzato nello stesso progetto, occorre prima richiamarlo nel file xaml del controllo (appena sotto il tag UserControl):

<!– Usa il file di ResourceDictionary con gli stili globali –>
<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Styles\GlobalStyles.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

(occhio che nomecartella\nomefile.xaml siano corretti) e poi usarlo a seconda delle esigenze:

<Label
    Name="label1"
    Style="{StaticResource CellTextStyle}">
    LabelLabelLabelLabelLabel
</Label>

 

Continue reading