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

ComInterop in C# e VB.NET

Creazione del progetto .NET di base

Dopo essersi letti un po’ di teoria, passiamo alla realizzazione di una vera classe C# da utilizzare all’interno di un programma VB6.

Come specificato nel post precedente, se si utilizza VB.NET c’e’ gia’ un template di progetto pronto per l’interoperabilita’. Utilizzando invece C# (o VB.NET con Visual Studio 2008) occorre farsi le cose a manina. Di seguito uno snippet di codice per creare la classe di base.

using System;
using Microsoft.VisualBasic;

namespace TestRegistazioneCom
{

[ComClass(TestComInterop.ClassId, TestComInterop.InterfaceId, TestComInterop.EventsId)]
public class TestComInterop
{
	public const string ClassId = "233D23FD-68C0-4da6-9749-8E137127692F";
	public const string InterfaceId = "6ACCBB64-3A0A-46ee-B8F8-9537CEBF2136";
	public const string EventsId = "B6A186AB-6212-4ab1-B998-7F471C5AE94B";

	public TestComInterop()
	{
	}

	public string GetName()
	{
		return "RainbowBreeze";
	}
}
}

I GUID (quelle lunghe stringe di numeri) vanno cambiati e messi nuovi, magari utilizzando il GUID Generator di Visual Studio (Tools -> Create Guid)

Configurazione del progetto .NET per l’interoperabilita’

Andare nelle proprieta’ del progetto, tab Application, bottone Assembly Information

Title: il titolo dell’assembly, viene messo in HKEY_CLASSES_ROOT ed e’ quello che apparira’ come nome della libreria creata
Description: la descrizione che apparira’ dentro VB6 quando si andranno ad aggiungere nuove reference
Version: la versione con cui la libreria .NET viene registrata
GUID: il GUID utilizzato per registrare l’oggetto all’interno del registry (HK_CR\TypeLib\). Viene generato automaticamente e deve essere univoco per non sovrapporsi ad altri GUID di altre librerie registrate nel sistema  Make Assembly COM-visible: va flaggata questa opzione

Continue reading

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

Usare controlli COM in .NET

20080617-com.png
I “vecchi” controlli realizzati usando dal tecnologia Microsoft COM (Component Object Model), hanno sicuramente cavalcato gli incubi di molti programmatori, fino a creare quell’universo di dolore parallelo chiamato DLL Hell, ben noto a chi ha sviluppato con Windows 95, 98, ME, NT, 2000 e forse forse anche XP. Insomma, prima dell’introduzione del .NET Framework.

Purtroppo però non sembrano del tutto morti e sepolti, anche perchè hanno dalla loro uno streminato partimonio di software binario scritto proprio in COM, e la loro riprogettazione per .NET si puo’ rivelare un spesa non banale da affrontare.

Ecco perchè risulta utile, delle volte, realizzare dei wrapper che permettano di utilizzare questi controlli anche all’interno di applicazioni .NET, procrastinando magari il giorno in cui veranno sostituiti del tutto e realizzando nel frattempo, grazie alla OOP, un buon layering delle proprie applicazioni, cosi’ quel giorno non fara’ poi tanta paura, Murphy permettendo. Ma anche la possibilita’ di usare fiammanti controlli .NET in vetuste applicazioni COM-enable ha il suo fascino, potendo cosi’ aggiornarle un pezzo alla volta, riutilizzando poi buonaparte del lavoro fatto.

Le tecniche di programmazione che studiano queste tematiche vanno sotto il nome di “.NET COM Interoperability”, ed hanno lo scopo di realizzare dei Runtime-Callable Wrappers (RCW: COM -> .NET) e dei COM-Callable Wrappers (CCW: .NET -> COM). Viene anche affrontato come gestire gli eventi e i dati di ritorno generati dal controllo inglobato.

Continue reading

Superare i limite del .NETCF: bottoni trasparenti, immagini animate

netcf-eden_effect.png
Chi programma per Windows Mobile con il .NET Compact Framework sa che c’e’ davvero poco spazio per l’interfaccia. Bottoni a cui non si possono agganciare immagini, disegno di elementi di liste che non puo’ essere personalizzato, completa mancanza di supporto alla trasparenza delle immagini: insomma, la vita non è facile se occorre realizzare qualcosa che vada oltre il semplice dataentry o consultazione di elenchi e viste.

Fortunatamente a Redmond se ne sono accorti, e se ancora non c’e’ nulla di ufficiale integrato nei controlli del .NET Compact Framework, ci sono in giro per la rete tante risorse utili che possono aiutare ad aggiungere quel tocco di bellezza in piu’ ai nostri programmi.

Graphics and Drawing in the .NET Compact Framework: una lista di tutorial che trattano lo zoom di immagini, la loro rotazione, il disegnarle con un colore di trasparenza, realizzare un gradient, gestire l’immagine di background di un form, ruotare un testo e diversi altri utili trucchetti.

How to Create a Microsoft .NET Compact Framework-based Image Button: questo tutorial spiega come affrontare la piu’ classica delle esigenze: realizzare un bottone con un’immagine.

Continue reading

Conversione di date e numeri location aware

Mi e’ capitato di dover salvare alcune informazioni, contenenti numeri e date, in un file di testo per poi rileggerle con un altro programma.

Tutto fattibile e semplice utilizzando il metodo .ToString(), se non che l’altro programma , quello che doveva leggere i dati, aveva delle impostazioni regionali (Regional Settings) diverse dal programma che salvava i dati. Le date erano nel formato mese/giorno/anno sul primo, giorno/mese/anno sul secondo, i numero avevano come separatore decimale il punto sul primo, la virgola nel secondo. Le conversioni quindi sballavano tutte.

Ho risolto forzando il salvataggio e la lettura in un formato unico, ecco come.

Salvataggio dei dati:

double dblAmount;
string[] arrTextToSave;

System.Globalization.CultureInfo ci = System.Globalization.CultureInfo.CurrentUICulture;
objFormatProvider = (System.Globalization.NumberFormatInfo)
ci.NumberFormat.Clone();
objFormatProvider.NumberDecimalSeparator = ".";

arrTextToSave new string[2] { DateTime.Now.ToString("yyyy/MM/dd"),
dblAmount.ToString(objFormatProvider) };

Continue reading

Databinding di controlli in .NET Compact Framework

Il databinding nel .NET Framework e’ di una grande utilita’ senza dubbio. Qui una panoramica su come utilizzarlo nelle proprie applicazioni.

Un problema da affrontare una volta cambiati i dati nell’oggetto con le informazioni (list, collection, datatable ecc), e’ quello di aggiornare il controllo a cui esso e’ collegato. Ci sono varie strade per farlo, ma quella che preferisco usare passa per l’uso del CurrencyManager.

Segue un breve esempio:

Continue reading