<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Rainbowbreeze &#187; WPF</title>
	<atom:link href="http://www.rainbowbreeze.it/tag/wpf/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.rainbowbreeze.it</link>
	<description>Alfredo Morresi personal website</description>
	<lastBuildDate>Sat, 28 Jan 2012 10:56:33 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Tema Aero in applicazioni WPF</title>
		<link>http://www.rainbowbreeze.it/tema-aero-in-applicazioni-wpf/</link>
		<comments>http://www.rainbowbreeze.it/tema-aero-in-applicazioni-wpf/#comments</comments>
		<pubDate>Tue, 13 Oct 2009 08:35:28 +0000</pubDate>
		<dc:creator>Alfredo</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Aero]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://www.rainbowbreeze.it/?p=834</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>Il layout grafico Aero, utilizzato di default in Vista, e’ reperibile e usabile anche in applicazioni WPF per Windows XP.<br />
Per abilitarlo ci sono diverse strade, alcune a livello di xaml, altre a livello di codice.</p>
<p><strong>Abilitazione via XAML</strong><br />
Come <a title="WPF: Utilizzare il tema Windows Aero in Windows XP" href="http://community.visual-basic.it/alessandro/archive/2007/11/04/20979.aspx" target="_blank">spiegato da Alessadro</a>, basta includere l’assembly <strong>PresentationFramework.Aero.dll</strong> tra le risorse dell’applicazione e poi aggiungere queste righe all’interno del file <strong>App.xaml</strong>, per fare in modo che tutta l’applicazione usi il tema Aero.</p>
<pre class="brush: xml">
<Application.Resources>
	<ResourceDictionary>
		<ResourceDictionary.MergedDictionaries>

		<!-- Impostazione del tema Aero -->
		<ResourceDictionary Source="/PresentationFramework.Aero;V3.0.0.0;31bf3856ad364e35;component/themes/aero.normalcolor.xaml"></ResourceDictionary>

		<!-- Impostazione per i temi personalizzati usati nell'applicativo -->
		<ResourceDictionary Source="pack://application:,,,/ComNet.Retail.UI.WPF.Touch;component/Themes/GlobalStyles.xaml"></ResourceDictionary>

		</ResourceDictionary.MergedDictionaries>
	</ResourceDictionary>
</Application.Resources>
</pre>
<p>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&#8217;interno dello stesso App.xaml.</p>
<p>Il risultato che si ottiene e&#8217; questo, conservando un look&#8217;nd feel omogeneo tra Windows XP e Windows Vista, contorno della finesta a parte:<br />
<a href="http://www.rainbowbreeze.it/wordpress/wp-content/uploads/2009/10/WPF_Aero_XP21.jpg"><img class="alignnone" style="border: 0pt none; margin: 2px 4px; display: inline;" title="WPF_Aero_XP2" src="http://www.rainbowbreeze.it/wordpress/wp-content/uploads/2009/10/WPF_Aero_XP2_thumb1.jpg" border="0" alt="WPF_Aero_XP2" width="240" height="240" align="bottom" /></a></p>
<p><strong>Abilitazione via codice</strong><br />
Se l&#8217;abilitazione del tema occorre farla via, basta includere queste righe nell’evento OnStartup dell’applicazione, file <strong>App.xaml.cs</strong> e sempre dopo aver referenziato <strong>PresentationFramework.Aero.dll</strong>:</p>
<pre class="brush: csharp">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);
</pre>
<p>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.<br />
<span id="more-834"></span></p>
<p><strong>Abilitazione selettiva via XAML</strong><br />
Si puo’ anche fare in modo che solamente una finestra dell’applicazione utilizzi il tema Aero, mentre il resto del programma continui ad utilizzare il suo tema predefinito.</p>
<pre class="brush: xml">
<Window.Resources>
	<ResourceDictionary>
		<ResourceDictionary.MergedDictionaries>

			<ResourceDictionary Source="/PresentationFramework.Aero;V3.0.0.0;31bf3856ad364e35;component/themes/aero.normalcolor.xaml"></ResourceDictionary>

			<ResourceDictionary>
				<local:TipoRigaConverter x:Key="TipoRigaConverter"></local:TipoRigaConverter>

				<!-- l'override dei colori del listview -->
				<Style x:Key="myListboxStyle">
					<Style.Resources>
						<!-- Background of selected item when focussed -->
						<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Red" />
						<!-- Background of selected item when not focussed -->
						<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Green" />
					</Style.Resources>
				</Style>
			</ResourceDictionary>
		</ResourceDictionary.MergedDictionaries>
	</ResourceDictionary>
</Window.Resources>
</pre>
<p>Anche in questo esempio, ho aggiunto una parte non funzionale all&#8217;impostazione del tema, quella del ResourceDictionary che contiene la dichiarazione del Converter e dello Style. Serve solo per far vedere come mettere tutto assieme all&#8217;interno delle Window.Resources.</p>
<p><strong>Abilitazione selettiva via codice</strong><br />
All’interno del code behind della mia Window, UserControl o altro elemento grafico, basta scrivere:</p>
<pre class="brush: csharp">
ResourceDictionary aero = new ResourceDictionary();
aero.Source = new Uri("/PresentationFramework.Aero;V3.0.0.0;31bf3856ad364e35;component/themes/aero.normalcolor.xaml", UriKind.RelativeOrAbsolute);
this.Resources.MergedDictionaries.Add(aero);
</pre>
<p>Io personalmente utilizzo questo codice nel costruttore dell&#8217;elemento, dopo la chiamata <strong>InizializeComponent()</strong>, ma si puo&#8217; usare dove serve, senza problemi, dipende dall&#8217;uso che viene fatto degli stili all&#8217;interno della window o controllo e se vengono definiti come StaticResource o DynamicResource (rispettivamente prima di InizializeComponent() o un po&#8217; ovunque nell&#8217;inizializzazione del controllo).</p>
<p><strong>Precauzioni varie</strong><br />
Se si vogliono definire ulteriori personalizzazioni all’aspetto dei controlli, bisogna utilizzare l’attributo <strong>BasedOn</strong> nella definizione dello stile, altrimenti si perde l’aspetto Aero. Ad esempio, per definire larghezza e altezza minina di un bottone:</p>
<pre class="brush: xml">
<!-- Stile bottone per essere facilmente spinto in un'intefaccia touch -->
<Style x:Key="TouchInputButtonStyle" TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
	<Setter Property="Width" Value="50"></Setter>
	<Setter Property="Height" Value="30"></Setter>
	<Setter Property="Margin" Value="5"></Setter>
</Style>
</pre>
<p>Questo stile potrebbe essere definito in un file WPF separato ed incluso con gli snippet di codice che facevo vedere sopra.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rainbowbreeze.it/tema-aero-in-applicazioni-wpf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WPF Style in external assembly</title>
		<link>http://www.rainbowbreeze.it/wpf-style-in-external-assembly/</link>
		<comments>http://www.rainbowbreeze.it/wpf-style-in-external-assembly/#comments</comments>
		<pubDate>Tue, 27 Jan 2009 09:19:49 +0000</pubDate>
		<dc:creator>Alfredo</dc:creator>
				<category><![CDATA[Misc]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Gestendo un progetto WPF abbastanza complesso, mi sono scontrato con la necessita&#8217; 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 [...]]]></description>
			<content:encoded><![CDATA[<p>
Gestendo un progetto WPF abbastanza complesso, mi sono scontrato con la necessita&#8217; 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.
</p>
<p>
Ho risolto usando dei <b>ResourceDictionary</b> dove immagazzinare queste risorse e usando delle <b>Pack URI</b> per referenziare questi dizionari nei vari progetti.
</p>
<p>
Qualche info su come spostare uno style dal singolo elemento fino ad un livello condiviso da tutta l&#8217;applicazione (il ResourceDictionary): <a href="http://blogs.vbcity.com/xtab/archive/2007/09/10/8693.aspx" target="_blank" title="Styles in WPF (2)- Styles, Resources and ResourceDictionaries">Styles in WPF (2) &#8211; Styles, Resources and ResourceDictionaries</a>.<br />
<br />
Per avere un&#8217;idea un po&#8217; piu&#8217; approfondita sulle Pack URI: <a href="http://msdn.microsoft.com/en-us/library/aa970069(VS.85).aspx" target="_blank" title="Pack URIs in Windows Presentation Foundation ">Pack URIs in Windows Presentation Foundation</a>.
</p>
<p>
&nbsp;
</p>
<h3>CREARE L&#8217;ASSEMBLY CON LE RISORSE CONDIVISE </h3>
<p>
Dato che nell&#8217;assembly andranno a finire alcuni controlli WPF personalizzati, ho aggiunto alla soluzione corrente un nuovo progetto di tipo <b>WPF Custom Control Library</b>, chiamandolo <b>MyTestProject.WPF.Global</b>.
</p>
<p>
Ho poi creato una cartella <b>Styles</b> (nome arbitrario) e all&#8217;interno di questa cartella ho aggiunto un nuovo item di tipo <b>Resource Dictionary (WPF)</b>, con nome <b>GlobalStyles.xaml</b>. In questo file xaml ho caricato i miei stili globali, ad esempio aggiungendo qualcosa tipo:
</p>
<p>
<i><br />
&lt;ResourceDictionary<br />
&nbsp;&nbsp;&nbsp; xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;<br />
&nbsp;&nbsp;&nbsp; xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;Style x:Key=&quot;<b>CellTextStyle</b>&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Setter Property=&quot;TextElement.FontSize&quot; Value=&quot;12&quot; /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Setter Property=&quot;TextElement.FontWeight&quot; Value=&quot;Bold&quot; /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/Style&gt;<br />
&lt;/ResourceDictionary&gt;<br />
</i>
</p>
<p>
Ora, se voglio usare questo stile all&#8217;interno di un controllo personalizzato nello stesso progetto, occorre prima richiamarlo nel file xaml del controllo (appena sotto il tag <i>UserControl</i>):
</p>
<p>
<i>&lt;!&#8211; Usa il file di ResourceDictionary con gli stili globali &#8211;&gt;<br />
&lt;UserControl.Resources&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;ResourceDictionary&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ResourceDictionary.MergedDictionaries&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <b>&lt;ResourceDictionary Source=&quot;Styles\GlobalStyles.xaml&quot;/&gt;</b><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ResourceDictionary.MergedDictionaries&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/ResourceDictionary&gt;<br />
&lt;/UserControl.Resources&gt;</i>
</p>
<p>
(occhio che <i>nomecartella\nomefile.xaml</i> siano corretti) e poi usarlo a seconda delle esigenze:
</p>
<p>
<i>&lt;Label<br />
&nbsp;&nbsp;&nbsp; Name=&quot;label1&quot;<br />
&nbsp;&nbsp;&nbsp; <b>Style=&quot;{StaticResource CellTextStyle}</b>&quot;&gt;<br />
&nbsp;&nbsp;&nbsp; LabelLabelLabelLabelLabel<br />
&lt;/Label&gt;</i>
</p>
<p>
&nbsp;
</p>
<p><span id="more-138"></span><br />
<h3>IMPOSTARE LO STILE NEL PROGETTO PRINCIPALE <br />
</h3>
<p>
Come prima cosa occorre aggiungere alle refence del progetto il progetto contenente gli stili condivisi.
</p>
<p>
Poi, nel file <b>App.xaml</b> bisogna richiamare questo stile aggiungendolo ai resource dictionary dell&#8217;applicazione.
</p>
<p>
<i>&lt;Application.Resources&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;ResourceDictionary&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ResourceDictionary.MergedDictionaries&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <b>&lt;ResourceDictionary Source=&quot;pack://application:,,,/MyTestApp.WPF.Common;component/Styles/GlobalStyles.xaml&quot;/&gt;</b><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ResourceDictionary.MergedDictionaries&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/ResourceDictionary&gt;<br />
&nbsp;&nbsp;&nbsp; &#8230;..<br />
&lt;/Application.Resources&gt;<br />
</i><i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
</i>(oltre che prestare attenzione a <i>nomecartella\nomefile.xaml</i>, stavolta c&#8217;e&#8217; di mezzo anche il nome dell&#8217;<i>assembly</i> dove risiedono). Stessa sintassi mostrata sopra per usare lo stile all&#8217;interno dei file xaml dell&#8217;applicazione.
</p>
<p>
Ovviamente se non si vuole condividere lo stile tra tutti gli elementi del progetto, basta spostare questa dichiarazione nel blocco <i>Page.Resources</i> o <i>Window.Resources</i> a seconda del file xaml dove si intende usare lo stile, togliendola dall&#8217;<i>App.xaml</i>.
</p>
<p>
<i><br />
</i>&nbsp;
</p>
<h3>CONSIDERAZIONI AGGIUNTIVE <br />
</h3>
<p>
Utilizzando la proprieta&#8217; <b>TargetType</b> e togliendo quella <b>x:Key</b> dell&#8217;elemento Style e&#8217; possibile creare uno stile che viene automaticamente applicato a tutti gli elementi del tipo definito in TargetType. Specificando, ad esempio, &quot;Button&quot;, tutti i bottoni presenti in file xaml dove lo stile agisce saranno influenzati. Con questo approccio si puo&#8217; facilmente creare una personalizzazione grafica da usare in tutte le applicazioni, mantenendo con facilita&#8217; una coerenza visiva nello sviluppo.
</p>
<p>
La proprieta&#8217; <b>BasedOn</b> dell&#8217;elemento Style offre la possibilita&#8217; di definire uno stile appoggiandosi su uno gia&#8217; esistente. Quindi magari si puo&#8217; definire uno stile globale e poi fare piccole personalizzazioni a seconda delle esigenze. Oppure stili globali in cascata, da applicare a secondo dei casi.
</p>
<p>
<a href="http://blogs.msdn.com/zainala/archive/2008/11/30/putting-resource-in-separate-xaml-files.aspx" target="_blank" title="Putting resource in separate xaml files">Putting resource in separate xaml files</a>  descrive come impostare uno stile globale, ma via codice C# invece che direttamente nei file xaml. Utile se occorre incudee qualche logica di scelta per decidere lo stile da caricare.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rainbowbreeze.it/wpf-style-in-external-assembly/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pattern per la localizzazione delle applicazioni WinForm, ASP.NET e WPF</title>
		<link>http://www.rainbowbreeze.it/pattern-per-la-localizzazione-delle-applicazioni-winform-asp-net-e-wpf/</link>
		<comments>http://www.rainbowbreeze.it/pattern-per-la-localizzazione-delle-applicazioni-winform-asp-net-e-wpf/#comments</comments>
		<pubDate>Fri, 23 Jan 2009 08:25:44 +0000</pubDate>
		<dc:creator>Alfredo</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Misc]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[ASP.Net]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Quando si sviluppa un&#8217;applicazione che potrebbe essere usata in diverse parti del mondo, occorre prevedere una localizzazione dell&#8217;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&#8217;interfaccia e&#8217; quello che, a mio avviso, tra [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" style="border: 0px solid #000000; margin: 2px 4px; width: 200px; height: 132px;" title="Localization of .NET applications" src="/site-media/blog-images/2009-images/localization.jpg" alt="Localization of .NET applications" width="200" height="132" />Quando si sviluppa un&#8217;applicazione che potrebbe essere usata in diverse parti del mondo, occorre prevedere una <strong>localizzazione dell&#8217;interfaccia</strong>. 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&#8217;interfaccia e&#8217; quello che, a mio avviso, tra tutti richiede il maggior tempo per gestito.</p>
<p>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&#8217; pertinente a determinate situazioni.</p>
<h4>WINFORM &#8211; LA VIA FACILE</h4>
<p>L&#8217;articolo MSDN relativo e&#8217; questo: <a title="Walkthrough: Localizing Windows Forms " href="http://msdn.microsoft.com/en-us/library/y99d1cd3(VS.80).aspx" target="_blank">Walkthrough: Localizing Windows Forms</a>.<br />
In pratica, se occorre localizzale label, menu e altri elementi di un form, il compito e&#8217; semplice e viene fatto tutto grazie all&#8217;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&#8217; <em>Language</em> del form e modificando le etichette dei controlli. Il sistema, in fase di esecuzione dell&#8217;applicativo, provvedera&#8217; a selezionare uno dei linguaggi personalizzati basandosi su quello del sistema. Se invece si vuole impostare una lingua, occorre agire su <em>Thread.CurrentThread.CurrentUICulture</em>. Tutto funziona grazie ad un file di risorse, creato automaticamente dall&#8217;editor, per ogni finestra  / controllo che localizzo con questo medoto.<br />
Approccio molto simile per ottenere delle stringhe localizzate, utili per MessageBox e altre informazioni da mostrare all&#8217;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&#8217;e&#8217; 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.<br />
<strong>Pro</strong> di questo metodo l&#8217;estrema <strong>facilita&#8217; di implementazione</strong> e la scrittura di poco codice, <strong>contro</strong> il fatto che occorre <strong>ricompilare e ridistribuire il progetto</strong> ad ogni cambiamento dei testi e che le risorse localizzate non risiedono in un unico punto ma sono sparse all&#8217;interno dell&#8217;applicazione.</p>
<p>Per localizzare anche i componenti che mostrano date e valute, occorre agire su <em>Thread.CurrentThread.CurrentCulture</em>, seguendo quanto scritto in <a title="How to: Set the Culture and UI Culture for Windows Forms Globalization" href="http://msdn.microsoft.com/en-us/library/b28bx3bh(VS.80).aspx" target="_blank">How to: Set the Culture and UI Culture for Windows Forms Globalization</a>.</p>
<h4>ASP.NET &#8211; RESOURCE PROVIDER PER TUTTI</h4>
<p><a title="ASP.NET 2.0 Localization Features: A Fresh Approach to Localizing Web Applications" href="http://msdn.microsoft.com/en-us/library/ms379546(VS.80).aspx" target="_blank">ASP.NET 2.0 Localization Features: A Fresh Approach to Localizing Web Applications</a>: l&#8217;articolo di riferimento da leggere per la localizzazione delle applicazioni un ASP.NET 2.0<br />
<a title="Introduction to Localization in ASP.NET 2.0" href="Introduction%20to%20Localization%20in%20ASP.NET%202.0" target="_blank">Introduction to Localization in ASP.NET 2.0</a>: 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&#8217;approccio WinForm precedente), spiega come impostare una pagina in base alla lingua predefinita nel browser dell&#8217;utente, fa una panoramica su risorse globali (<em>GetGlobalResourceObject</em>) e risorse locali (<em>GetLocalResourceObject</em>), su come funziona il <em>Resource Fallback</em>, su come assegnare via markup code il testo dei controlli nella pagina asp grazie alle <em>Implicit</em> ed <em>Explicit Resource Expressions</em>.</p>
<p><strong>Punti di debolezza</strong> di questi approcci, il fatto che <strong>i resource file sono gestiti automaticamente</strong> e non si possono condividere, ad esempio, con una versione WinForm della stessa applicazione. Inoltre, come il precedente, <strong>ogni cambiamento delle risorse necessita di una ricompilazione e ridistribuzione</strong> di parti dell&#8217;applicazione.</p>
<p><span id="more-135"></span></p>
<h4>WINFORM e ASP.NET &#8211; GESTIONI PIU&#8217; COMPLESSE</h4>
<p>Se l&#8217;uso dei file di risorse dell&#8217;applicazione non e&#8217; quello che si vuole usare, perche&#8217; magari le traduzioni devono risiedere su un database oppure devono essere distribuite attraverso file xml, se occorre tenere in considerazione l&#8217;orientamento del testo della cultura scelta nel disegno del form, se per ognuna occorre anche ridimensionare label e textbox o cambiare immagini e colori, allora le due precedenti &#8220;via facili&#8221; non sono piu&#8217; sufficienti.</p>
<p>Fortunatamente ASP.NET offre la possibilita&#8217; di definire dei <strong>custom resource provider</strong>, in grado di accedere alle risorse fuori dall&#8217;ambito dell&#8217;<em>App_GlobalResources</em> e dell&#8217;<em>App_LocalResources</em>. Ad esempio alimentandosi da un database o da un assembly esterno.<br />
<a title="Extending the ASP.NET 2.0 Resource-Provider Model" href="http://msdn.microsoft.com/en-us/library/aa905797.aspx" target="_blank">Extending the ASP.NET 2.0 Resource-Provider Model</a> mostra come implementare un proprio <strong>Database Resource Provider</strong>, prestando attenzione a fattori come il resource fallback, il caching, l&#8217;accesso multithreading al database e l&#8217;impostazione dellla sezione <em>&lt;globalization&gt;</em> del <em>Web.config</em> per usare il proprio resource provider. Segue anche una trattazione per attingere i dati da un assembly esterno. per la lettura dei dati.<br />
<a title="Creating a Data Driven ASP.NET Localization Resource Provider and Editor" href="http://www.west-wind.com/presentations/wwDbResourceProvider/" target="_blank">Creating a Data Driven ASP.NET Localization Resource Provider and Editor</a>: seguendo l&#8217;approccio del precedente articolo, viene costruito un Database Resource Provider ed un <a title="wwDbResourceProvider" href="http://www.west-wind.com/tools/wwDbResourceProvider/" target="_blank">editor ASP.NET</a> per modificare agevolmente le risorse. Trattazione esplicita e molti esempi di codice, con la definizione completa  e puntuale di tutto quello che va implementato.</p>
<p>Per quanto rigurda le applicazioni WinForm invece non esiste un approccio standard alla risoluzione di questi problemi, e occorre fare molte cose via codice esplicito, creandosi il proprio dizionario dove contenere le traduzioni localizzate, modificare attraverso il codice label, titoli, posizioni e quant&#8217;altro occorre considerare per la cultura corrente.<br />
Oppure passara a WPF.</p>
<h4>LOCALIZZAZIONE IN WINDOWS PRESENTATION FOUNDATION (WPF)</h4>
<p>Il discorso si fa ampio e complesso perchè WPF e&#8217; pensato per la localizzazione piu&#8217; totale, quindi sono molte le possibilità offerte, ognuna con i suoi pro e contro e con determinati aspetti tenuti in considerazione: verso di scrittura, (sinistra-destra oppure destra-sinistra) grandezza dei controlli che si devono o non devono autoridimensionare a secondo del testo in essi contenuto.<br />
cultura di fallback, quella cioe&#8217; da usare se non esiste la specifica cultura impostata nel sistema operativo in uso,  l&#8217;uso del tag <a title="xml:lang Handling in XAML" href="http://msdn.microsoft.com/en-us/library/ms788730.aspx" target="_blank">Xml:lang</a>, possibilita&#8217; di modificare a runtime la cultura usata. I risultati, comunque, sono abbastanza semplici da ottenere.</p>
<p>Un po&#8217; di <strong>teoria</strong>:<br />
<a title="WPF Globalization and Localization Overview" href="http://msdn.microsoft.com/en-us/library/ms788718.aspx" target="_blank">WPF Globalization and Localization Overview</a>: best practices nel disegno di interfacce multilinguaggio, definizione di un <em>language-neutral main assembly</em> per il progetto e dei <em>language-dependent satellite resource assembly</em> dove inserire le proprie risorse localizzate. Utilizzo del tag Uid negli elementi del file xaml.<br />
<a title="Globalization for the Windows Presentation Foundation" href="http://msdn.microsoft.com/en-us/library/ms745650.aspx" target="_blank">Globalization for the Windows Presentation Foundation</a>: Aggiunge, rispetto al precedente, qualche raccomandazione per l&#8217;uso di ClickOnce</p>
<p>Ed alcuni <strong>esempi hands-on</strong>:<br />
<a title="Globalization and Localization Samples" href="http://msdn.microsoft.com/en-us/library/ms771320.aspx" target="_blank">Globalization and Localization Samples</a>: una serie di esempi tratti dalla MSDN che fanno vedere varie tecniche di localizzazione focalizzate su piccole e semplici tematiche.<br />
<a title="WPF Multi-Lingual at Runtime" href="http://www.codeproject.com/KB/WPF/WPF-Mulit-Lingual.aspx" target="_blank">WPF Multi-Lingual at Runtime</a>: localizzazione delle stringhe di un xaml mediante file xml. Soluzione semplice per situazioni semplici, la lettura del primo commento &#8220;My favorite approach&#8221; suggerisce come alleggerire un po&#8217; il file xml e lo xaml.<br />
<a title=" Localizing WPF Applications using Locbaml" href="http://www.codeproject.com/KB/WPF/WPFUsingLocbaml.aspx" target="_self">Localizing WPF Applications using Locbaml</a>: in realta&#8217; tre articoli in uno, questo esauriente tutorial si approccia alla locazzazione di un&#8217;applicazione WPF seguendo tre diverse strade: la prima utilizza il <em>Resources.resx</em>, la classe <em>Properties.Resources</em> e un po&#8217; di sano binding nello xaml. La seconda invece crea delle <em>satellite dll</em>, usa gli Uid degli elementi dello xaml, usa <em>MSBuild.exe</em> e <a title="How to: Localize an Application" href="http://msdn.microsoft.com/en-us/library/ms746621.aspx" target="_blank"><em>LocBaml.exe</em></a> e altri concetti. La terza e&#8217; un&#8217;ulteriore raffinazione della seconda tecnica. Personalmente ho trovato il primo approccio semplice e abbastanza utile. Inoltre, non ho neanche dovuto ridefinire il <em>ResXFileCodeGenerator</em> grazie al commento &#8220;<em>Found I didn&#8217;t need the custom code generator</em>&#8220;, ho notato che l&#8217;editor xaml di Visual Studio 2008 offre pieno supporto a questo approccio, senza i problemi che ha avuto l&#8217;autore. Occorre pero&#8217; correggere il contenuto del tag &lt;Button&gt; sostituendo la stringa<br />
<em>&#8220;{x:Static properties:Resources.MainButtonText}&#8221;</em><br />
con la stringa<br />
<em>&lt;TextBlock TextAlignment=&#8221;Center&#8221; Text=&#8221;{x:Static properties:Resources.MainButtonText}&#8221;/&gt;</em></p>
<p><a title="Real-Time Multilingual WPF Demo" href="http://www.codeproject.com/KB/WPF/realtime_multilingual.aspx" target="_blank">Real-Time Multilingual WPF Demo</a>: un progetto che si appoggia sul servizio di traduzione online offerto da Google per ottenere on-the-fly le stringhe da tradurre in base ad un linguaggio di origine e uno di destinazione impostabili a runtime. Prevede anche l&#8217;uso di una <em>custom markup extension</em> per rendere più facile da scrivere il codice xaml.</p>
<p>Ci sono poi delle <strong>librerie</strong> che permettono di usare altri modi di gestire la localizzazione di stringhe e immagini, senza dover usare LocBaml, file di risorse ed altro.<br />
<a title="WPF Localization by Tomer Shamam" href="http://blogs.microsoft.co.il/blogs/tomershamam/archive/2007/10/30/wpf-localization-on-the-fly-language-selection.aspx" target="_blank">WPF Localization by Tomer Shamam</a>:<br />
i dizionari usati per le traduzioni possono essere creati in maniera disaccoppiata dalla forma di persistenza, potendo quindi usare xml, database o altro, prevede l&#8217;utilizzo di parametri bindabili nelle stringe localizzate ed e&#8217;<br />
inclusa anche una markup language extension per rendere piu&#8217; elegante e semplice la scrittura dello xaml. Permette di bindare qualunque<br />
attributo dei controlli, ad esempio la larghezza di una label, nel codice viene mostrato come usare diverse immagini a secondo della lingua usata. Gestiti i valori di default, <span id="ctl00_ctl00_MasterContent_Content_wikiSourceLabel">update automatico delle proprieta&#8217; localizzate dei controlli a runtime</span>, supportati i DataTemplate ma non la localizzazione dei ContextMenu.<br />
<span id="ctl00_ctl00_MasterContent_Content_wikiSourceLabel"><a title="WPF LocalizeExtension" href="http://www.codeplex.com/WPFLocalizeExtension" target="_blank">WPF LocalizeExtension by SeriousM</a></span><span id="ctl00_ctl00_MasterContent_Content_wikiSourceLabel">: utilizza file di risorse (<em>.resx</em>) per memorizzare i contenuti da localizzare, senza passare quindi per le satellite dll e supportando il .resx-fallback mechanism (en-us -&gt; en -&gt; independent culture). Custom markup extension per la scrittura semplificata dello XAML, possibilita&#8217; di visualizzare un certo linguaggio a design-time, update automatico delle proprieta&#8217; localizzate dei controlli a runtime, gestione del binding anche nel code behind, la chiave per collegare la risorsa localizzata e&#8217; composta da <em>assembly:nomerisorsaresx:chiave</em>. Libreria potente, una scelta obbligata se volete far uso dei file resx.<br />
</span><a title="WPF application localization kit by Taggersoft" href="http://blog.taggersoft.com/2008/07/wpf-application-localization-pattern_29.html" target="_blank">WPF application localization kit by Taggersoft</a>: terza soluzione del gruppo, c&#8217;e&#8217; un buon tutorial che ne spiega l&#8217;utilizzo, ma le localizzazioni devono risiedere necessariamente su di uno XAML based ResourceDictionary e non e&#8217; cosi&#8217; potente come le precedenti.<a title="WPF Localization by Tomer Shamam" href="http://blogs.microsoft.co.il/blogs/tomershamam/archive/2007/10/30/wpf-localization-on-the-fly-language-selection.aspx" target="_blank"><br />
</a></p>
<p>Personalmente per le mie applicazioni WPF utilizzero&#8217; la libreria di SeriosM, con qualche piccola modifica, in modo da avere le traduzioni residenti sul db e poterle cosi&#8217; gestire in maniera molto flessibile.</p>
<h4>CONCLUSIONI</h4>
<p>La trattazione dell&#8217;argomento non puo&#8217; essere esaustiva, dato che nuovi pattern possono essere implimentati a secondo dei propri bisogni. Voglio comunque segnalare alcuni strumenti che possono aiutare in questo compito, come ad esempio <a title="RGreatEx" href="http://www.safedevelop.com/Products/RGreatEx/" target="_blank">RGreatEx</a>, un plugin a pagamento per Visual Studio che identifica le stringhe di testo e ne fa il rafactoring in file di risorse, controlla inoltre se sono state localizzate per tutte le lingue, traduce automaticamente una stringa appoggiandosi su servizi online e molto altro. Oppure un breve snippet di codice per accedere ad una risorsa in una satellite dll: <a title="How to: Access Resources in Satellite DLLs" href="http://msdn.microsoft.com/en-us/library/ms165653.aspx" target="_blank">How to: Access Resources in Satellite DLLs</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rainbowbreeze.it/pattern-per-la-localizzazione-delle-applicazioni-winform-asp-net-e-wpf/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

