Skip to content
Archive of posts tagged WPF

Tema Aero in applicazioni WPF

Il layout grafico Aero, utilizzato di default in Vista, e’ reperibile e usabile anche in applicazioni WPF per Windows XP.
Per abilitarlo ci sono diverse strade, alcune a livello di xaml, altre a livello di codice.

Abilitazione via XAML
Come spiegato da Alessadro, basta includere l’assembly PresentationFramework.Aero.dll tra le risorse dell’applicazione e poi aggiungere queste righe all’interno del file App.xaml, per fare in modo che tutta l’applicazione usi il tema Aero.


	
		

		
		

		
		


Il secondo dizionario che viene usato contiene altri temi aggiuntivi, quindi non e’ indispensabile per abilitare Aero. L’ho messo solo come nota per far vedere come includere e usare stili presi da altri assembly all’interno dello stesso App.xaml.

Il risultato che si ottiene e’ questo, conservando un look’nd feel omogeneo tra Windows XP e Windows Vista, contorno della finesta a parte:
WPF_Aero_XP2

Abilitazione via codice
Se l’abilitazione del tema occorre farla via, basta includere queste righe nell’evento OnStartup dell’applicazione, file App.xaml.cs e sempre dopo aver referenziato PresentationFramework.Aero.dll:

ResourceDictionary aero = new ResourceDictionary();
aero.Source = new Uri("/PresentationFramework.Aero;V3.0.0.0;31bf3856ad364e35;component/themes/aero.normalcolor.xaml", UriKind.RelativeOrAbsolute);
Application.Current.Resources.MergedDictionaries.Add(aero);

ResourceDictionary dict = new ResourceDictionary();
dict.Source = new Uri("/ComNet.Retail.UI.WPF.Touch;component/Themes/GlobalStyles.xaml", UriKind.RelativeOrAbsolute);
Application.Current.Resources.MergedDictionaries.Add(dict);

Stesso discorso fatto sopra per i temi aggiuntivi vale anche per la seconda parte di questo snippet, quella importante e’ solo la prima sezione di codice.
Continue reading ‘Tema Aero in applicazioni WPF’ »

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 ‘WPF Style in external assembly’ »

Pattern per la localizzazione delle applicazioni WinForm, ASP.NET e WPF

Localization of .NET applicationsQuando si sviluppa un’applicazione che potrebbe essere usata in diverse parti del mondo, occorre prevedere una localizzazione dell’interfaccia. Se tratta quindi di mostrare componenti, messaggi e altre parti del programma nella giusta lingua. Certo, ci sono molti altri problemi da affrontare quando si parla di localizzazione, ma l’interfaccia e’ quello che, a mio avviso, tra tutti richiede il maggior tempo per gestito.

Non esiste un metodo universalmente riconosciuto e usato per fare tutto questo in .NET, anche se ci sono strumenti e pattern più o meno complessi il cui uso e’ pertinente a determinate situazioni.

WINFORM – LA VIA FACILE

L’articolo MSDN relativo e’ questo: Walkthrough: Localizing Windows Forms.
In pratica, se occorre localizzale label, menu e altri elementi di un form, il compito e’ semplice e viene fatto tutto grazie all’editor di Visual Studio. Si disegna la propria finestra e si impostano tutte le etichette standard, quelle che devono apparire di default. Si passano poi a definire le traduzioni per un certo linguaggio impostando la proprieta’ Language del form e modificando le etichette dei controlli. Il sistema, in fase di esecuzione dell’applicativo, provvedera’ a selezionare uno dei linguaggi personalizzati basandosi su quello del sistema. Se invece si vuole impostare una lingua, occorre agire su Thread.CurrentThread.CurrentUICulture. Tutto funziona grazie ad un file di risorse, creato automaticamente dall’editor, per ogni finestra  / controllo che localizzo con questo medoto.
Approccio molto simile per ottenere delle stringhe localizzate, utili per MessageBox e altre informazioni da mostrare all’utente. Si crea un file delle risorse (quello di default e quelli specifici per le lingue gestite), si inseriscono in questi file le coppie chiave/valore (nel valore c’e’ il testo tradotto) e poi da codice si usa un ResourceManager, legato al file delle risorse creato, per ottenere i valori delle chiavi richieste in base alla cultura corrente.
Pro di questo metodo l’estrema facilita’ di implementazione e la scrittura di poco codice, contro il fatto che occorre ricompilare e ridistribuire il progetto ad ogni cambiamento dei testi e che le risorse localizzate non risiedono in un unico punto ma sono sparse all’interno dell’applicazione.

Per localizzare anche i componenti che mostrano date e valute, occorre agire su Thread.CurrentThread.CurrentCulture, seguendo quanto scritto in How to: Set the Culture and UI Culture for Windows Forms Globalization.

ASP.NET – RESOURCE PROVIDER PER TUTTI

ASP.NET 2.0 Localization Features: A Fresh Approach to Localizing Web Applications: l’articolo di riferimento da leggere per la localizzazione delle applicazioni un ASP.NET 2.0
Introduction to Localization in ASP.NET 2.0: questo articolo, che attinge a larga mano dal precedente, espone alcuni concetti di base della localizzazione in ASP.NET 2.0, parlando di assembly delle risorse (gli stessi utilizzati in maniera trasparente nell’approccio WinForm precedente), spiega come impostare una pagina in base alla lingua predefinita nel browser dell’utente, fa una panoramica su risorse globali (GetGlobalResourceObject) e risorse locali (GetLocalResourceObject), su come funziona il Resource Fallback, su come assegnare via markup code il testo dei controlli nella pagina asp grazie alle Implicit ed Explicit Resource Expressions.

Punti di debolezza di questi approcci, il fatto che i resource file sono gestiti automaticamente e non si possono condividere, ad esempio, con una versione WinForm della stessa applicazione. Inoltre, come il precedente, ogni cambiamento delle risorse necessita di una ricompilazione e ridistribuzione di parti dell’applicazione.

Continue reading ‘Pattern per la localizzazione delle applicazioni WinForm, ASP.NET e WPF’ »