WPF
Windows Presentation Foundation
Finalmente la tanto attesa nuova versione del controllo ribbon per WPF è disponibile: l’interfaccia applicativa è stata completamente rivista e, yes!, l’oggetto RibbonButton supporta ICommand. In questo post di Pete Brown trovate un tutorial sul suo utilizzo: http://10rem.net/blog/2010/08/02/announcing-microsoft-ribbon-for-wpf-rtw Download page: http://www.microsoft.com/downloads/details.aspx?FamilyID=2BFC3187-74AA-4154-A670-76EF8BC2A0B4&displaylang=en Documentazione: http://msdn.microsoft.com/en-us/library/ff799534.aspx Technorati Tags: WPF Ribbon
Su CodePlex è stata pubblicata la WPF Shell Integration Library, una libreria che permette di integrare le window delle vostre applicazioni con Aero di Windows ottenendo l’effetto visibile nella seguente figura: La libreria è disponibile qui: Un esempio lo trovate attraverso questo blog post (per eseguire l’esempio dovete scaricare la lireria e referenziarla all’interno del progetto) Technorati Tags: WPF Shell Integration Library
Una delle prime regole quando si lavora con WPF/SL/WP7 è organizzare le risorse in modo tale che sia immediato capire dove si trovano gli stili,templates e brushes. Forti di questa convizione, con Blend la cosa è spaventosamente semplice supponiamo di voler definire il colore di sfondo di un Border: Trasciniamo il Border nell’artboard e, col border selezionato, usiamo il menu Object->Edit Style->Create Empty Rispettando l’esigenza di organizzazione delle risorse, indichiamo a Blend di memorizzare lo style in un nuovo ResourceDictionary Styles.xaml: Fatto questo, all’interno della definizione dello Style cambiamo il colore...
Chi mi conosce sa come come per me la Blendability sia una requisito essenziale nello sviluppo di un applicazione WPF/Silverlight, non tutti la pensano così ma come sappiamo il mondo è bello perchè è vario. Oggi ho passato gran parte della mattinata a rifattorizzare del codice affinchè la design experience fosse la migliore possibile, ma malgrado tutti i tentativi in una particolare situazione la blendability non voleva saperne di funzionare senza apparente motivo. Chi di voi ha affrontato problemi di questo tipo sa quanto sia difficile intervenire in quanto non si ha il controllo...
Visto che ultimamente parecchi miei posts sono dedicati a Blend e avendo “twettato” “Not using Expression Blend? you’re out of business”, un paio di persone mi hanno chiesto: “Ma sei diventato un designer?”, la risposta è ovviamente “No”, essere un designer richiede estro e creatività, doti che personalmente ritengo innate e che purtroppo so di non possedere. Il motivo del mio tweet è semplicemente dovuto al fatto che, anche alla luce di ciò che la versione 4.0 permette di fare, ritengo semplicemente che non usare Blend per sviluppare applicazioni WPF/Silverlight e Window Phone 7 sia semplicemente...
Sono da sempre un sostenitore di Blend e continuo a ritenerlo uno strumento indispensabile per chi sviluppa applicazioni WPF/Silverlight (ora dovrei forse anche aggiungere Windows Phone 7…) ovviamente ci sono delle funzionalità che dal basso della mia esperienza ho sempre ritenuto degli ottimi “tentativi” ma nulla di più: il caso più evidente sono i Design time data, ovvero la possibilità di definire dei dati disponibili a design time per facilitare il disegno della user Interface Il motivo percui non ho mai preso in considerazione questa possibilità e facile da capire: Se i dati a runtime provengono...
Un applicazione WPF/Silverlight basata su Model-View-ViewModel è il risultato di un insieme di dettagli che fanno la differenza, ad esempio una delle cose che sto iniziando ad apprezzare e grazie al quale è possibile fare delle cose veramente carine con poco sforzo è il VisualStateManager (che in WPF 4.0 diventa parte integrante della piattaforma) Prendiamo un caso molto semplice: Cambiare il colore di un rettangolo (ma la cosa potrebbe essere complessa a piacere) alla pressione di un tasto. Usando Blend, definiamo due stati Normal e Fail e in ognuno di essi cambiamo il...
E’ stato rilasciata la nuove release del WPF Toolkit datata Febbraio 2010, oltre ai soliti fix da notare la presenza dei nuovi controlli AutoCompleteBox,Accordion e Rating il cui codice è condiviso al 100% con gli equivalenti in Silverlight, quale miglior segno di convergenza tra le due tecnologie? Lo trovate qui: http://wpf.codeplex.com/releases/view/40535 Technorati Tags: WPF Toolkit
Cosa vi piacerebbe avere nella prossima versione di WPF? dite la vostra votando qui: http://dotnet.uservoice.com/forums/40583-wpf-feature-suggestions Visto che la stessa cosa è stata fatta con Silverlight 4.0 e gran parte delle richieste è stata soddisfatta vale la pena votare. Technorati Tags: WPF,User Voice
Quando si usa la funzionalità Edit Template->Edit a Copy di Blend Blend in realtà crea uno style che applica il template appena estratto. Personalmente mi piace organizzare le risorse all’interno di resource dictionaries (styles.xaml, templates.xaml…) e, sebbene Blend permetta di specificare dove posizionare lo style il risultato è che style e template sono tutt’uno e spesso finisco per spostare il template nel relativo resource dictionary e linkarlo nello style via {StaticResource} manualmente. Oggi, Laurent, mi ha indicato come fare il tutto direttamente da Blend: Mentre si è in modalità di editing...
Se sviluppate un applicazione WPF 4.0 e utilizzate Blend preview for .NET 4.0 per disegnare la UI fate attenzione che se utilizzate Font Embedding (vedi immagine) la vostra applicazione diventa dipendente dall’ SDK di Blend a causa di questa righe inserita nel file di progetto <Import Project="$(MSBuildExtensionsPath)\Microsoft\Expression\Blend\3.0\WPF\Microsoft.Expression.Blend.WPF.targets" /> e di conseguenza il progetto non verrà caricato in assenza dell’installazione di Blend. Poco male, basta saperlo… Technorati Tags: WPF,Blend
Ho parlato di MEF (Managed Extensibility Framework) parecchio tempo fa, ora che il framework è ben definito è evidente che se dovete sviluppare un applicazione ‘dinamica’ (o a plug-in se preferite) MEF è sicuramente la tecnologia da utilizzare. Ovviamente se l’applicazione è WPF o Silverlight l’accoppiare MEF e Model-View-ViewModel è d’obbligo, ecco quindi un semplice esempio di M-V-VM basato sul principio di composizione di MEF. Data Provider public interface IProvider
{
string GetName();
}
...
Silverlight 3.0 ha introdotto l’oggetto Frame grazie al quale è possibile navigare le pagine che compongono l’intera applicazione, l’utilizzo di Frame è abbastanza semplice, supponendo infatti di avere la pagina principale della nostra applicazione (MainPage.xaml) definita in questo modo: <Grid x:Name="LayoutRoot">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="2*" />
...
Scopo: Muovere un elemento X dalla posizione “A” alla “B” usando l’oggetto VisualStateManager di WPF e Silverlight. In tutti e tre i casi (WPF 3.5, WPF 4.0 e Silverlight X) lo XAML generato da Blend è esattamente lo stesso: 1: <Grid x:Name="LayoutRoot">
2: <VisualStateManager.VisualStateGroups>
3: <VisualStateGroup x:Name="States">
4: <VisualState x:Name="Normal"/>
5: ...
Prendiamo uno UserControl che contiene una semplice listbox: 1: <Grid>
2: <ListBox HorizontalAlignment="Stretch"
3: Name="listBox1"
4: ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl},Path=MyValues}"
5: ...
Col SP1 del framework 3.5 è stato introdotto il namespace System.ComponentModel.DataAnnotations il quale ha al suo interno degli interessanti attributi di validazione (dettagli qui) Ad esempio, volendo validare una proprietà del nostro ViewModel, quello che dobbiamo fare è semplicemente scrivere del codice come quello che segue dopo aver aggiunto un riferimento a System.ComponentModel.DataAnnotations: 1: public class MyViewModel:INotifyPropertyChanged
2: {
3: ...
Usare delle combinazioni di tasti oppure il mouse come shortcut per alcune funzionalità tipo Apri, Stampa, Salva etc è un requisito abbastanza comune, peccato che gestire questo aspetto utilizzando il pattern Model-View-ViewModel non sia proprio banale a causa di una piccola limitazione: la proprietà Command dell’oggetto KeyBinding non è una dependency property. Il workaround ovviamente esiste, è però un peccato che si debba reinventare la ruota per realizzare banalità del genere. Con WPF4 finalmente la proprietà Command di MouseBinding e KeyBinding diventano delle dependency properties questo significa che è possibile mappare delle gestures...
Nel preparare il corseware per il corso “Mastering WPF” che terrò insieme a Mauro tra qualche settimana, ho dato un occhio alla novità di WPF 4.0 che riguarda le XBAP application. Fino alla versione 3.5 malgrado sia possibile impostare una applicazione XBAP come ‘full trust’: Lanciando l’applicazione si ottiene questo errore: Questo perchè la permission elevation di ClickOnce non è disponibile. In realtà il problema è facilmente aggirabile installando il relativo certificato sulla macchina locale, ma...
A tutti gli estimatori di Prism segnalo il rilascio della versione 2.1, le principali novità sono: All Visual Studio projects (Composite Application Library, reference implementation, and Quickstarts) were migrated to use Silverlight 3. TabRegionControlAdapter was modified to support binding in the TabItem’s control header in Silverlight 3. CreateXap.bat file was modified to search for Silverlight 3 assemblies if the Silverlight 2 reference assemblies cannot be found. Implemented the WeakEvent Pattern for the DelegateCommand’s and CompositeComand’s (more on this below). Download: http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=387c7a59-b217-4318-ad1b-cbc2ea453f40 Technorati Tags: Prism
Tra le svariate novità di Visual Studio 2010 c’è un tool che permette di visualizzare velocemente la posizione di un elemento nel suo Visual Tree (se questo vi ricorda Mole non state sbagliando…) per visualizzarlo basta posizionare il cursore su una variabile che rappresenta un elemento di UI: selezionare WPF Tree Visualizer per ottenere una rappresentazione gerarchica dello stato del visual tree: Purtroppo a differenza di Snoop, non è possibile modificare valori delle proprietà. Technorati Tags: Visual Studio 2010,WPF Visualizer
Dopo avere installato Visual Studio 2010 Beta2 è possibile migliorare le performance del designer WPF/Silverlight modificando il registry in questo modo: 1. Close any open VS instances 2. Open RegEdit (as an administrator as needed) 3. Select the HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0 key 4. Right click and add key, type ClrHost 5. In the newly created key, right click and add a DWORD32 with the name StartupFlags 6. Set its value to 5 ...
Piccolo trick per impostare l’elemento che deve avere il focus quando viene visualizzata una finestra…, non funziona in tutti i contesti ma può sempre venire utile… 1: <Window x:Class="D01_MovieCatalog.Views.CatalogView"
2: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4: Title="CatalogView"
5: ...
Spesso mi viene chiesto dove è possibile reperire dei temi/skin per WPF e Silverlight da applicare alle proprie applicazioni in modo da ottenere velocemente un look and feel più moderno e accattivante. Visto che puntualmente mi dimentico l’indirizzo del sito, me lo segno qui: http://www.xamltemplates.net/ Technorati Tags: XAML Templates
Quando si utilizza un custom ErrorTemplate per segnalare eventuali errori di validazione bisogna tenere in considerazione alcuni effetti secondari derivanti dal suo utilizzo. Consideriamo il caso più semplice: Una textbox bindata ad una proprietà di un ViewModel che implementa IDataErrorInfo la cui parte di validazione è la seguente: 1: #region IDataErrorInfo Members
2:
3: public string Error
4: {
5:...
Quando si realizzano dei controlli WPF e/o Silverlight, il loro comportamento a design time è tanto importante quanto quello a runtime, a questo link trovate tutte le informazioni per gestire al meglio l’integrazione dei vostri controlli all’interno di Visual Studio e Expression Blend. Technorati Tags: WPF,Silverlight,Design Mode
In WPF la localizzazione è ‘ufficialmente’ compito di LocBaml, tool che personalmente preferisco evitare per una lunga serie di motivi, non ultima il fatto che la non è applicabile a Silverlight. Per localizzare le applicazioni basate sul pattern Model-View-ViewModel la soluzione che utilizzo è la seguente. Aggiungo al mio progetto i vari files .resX che contengono i vari testi localizzati: ...
Nella lista dei WPF Disciples si è discusso di come determinare in maniera corretta la modalità Design Mode, ovvero quando il codice sta girando nel contesto di un desginer. Le risposte sono: WPF 1: public static class Designer
2: {
3: private static readonly bool isDesignMode;
4:
5: public static bool IsDesignMode {get { return...
L’altro giorno stavo chattando con Larent Bugnion riguardo nuove features da aggiungere nel suo progetto M-V-VM light toolkit ed entrambi eravamo concordi nella necessità di aggiungere un behavior che mappasse un generico evento verso un comando esposto dal ViewModel. Questa necessità è ancor più sentita in Silverlight dove il meccanismo di commanding, ICommand a parte, non è presente. Un esempio di possibile attached behavior è quello che segue: 1: public static class EventCommand
2: ...
Una semplice richiesta da parte di un cliente di Managed Designs relativamente ad una applicazione WPF che deve visualizzare degli elementi in posizioni ben precise ed eseguire delle operazioni in base agli items selezionati ha dato origine a questo post, il cui scopo è quello di mostrare come sia fondamentale cambiare il modo di pensare ad una interfaccia WPF/Silverlight rispetto alla vecchia tecnologia Windows Forms.
Il cliente aveva sviluppato l’idea aggiungendo e posizionando dinamicamente gli elementi ad un Canvas per poi rendersi conto durante lo sviluppo che la soluzione utilizzata portava ad un vicolo cieco.
La soluzione che abbiamo proposto...
In un architettura basata su Model-View-ViewModel (MVVM) spesso è necessario ‘iniettare’ nel ViewModel delle entities di supporto al ViewModel stesso, ad esempio, in un ottica ViewModel-First è consuetudine passare nel costruttore una generica IView in modo che il ViewModel possa poi comunicare facilmente con la view stessa. L’utilizzo di un interfaccia fa si che questo approccio non comprometta la testabilità del ViewModel in quanto l’interfaccia è facilmente ‘mockabile’ ma Il fatto di avere un ViewModel che non ha un costruttore pubblico senza parametri compromette un altro aspetto al quale è difficile rinunciare: Il supporto a design...
Che l’implementazione di INotifyPropertyChanged porti a scrivere del codice non propriamente ‘bello’ e funzionale è ormai scontato, personalmente non è mai stato un problema, bisogna però avere l’accortezza (e questo non sempre avviene) di rinominare il nome della funzione passato nell’evento quando si fa refactoring: soluzione decisamente molto “Code Smelling”. 1: public class MyClass:INotifyPropertyChanged
2: {
3: string userName;
4:
...
A questo indirizzo è possibile trovare il primo capitolo (100 pagine) e relativi samples di un libro interament dedicato a SketchFlow, sicuramente da scaricare se siete interessati e non avete ci mai ‘giocato’ in precedenza. Technorati Tags: SketchFlow
Essendo una domanda ricorrente credo sia il caso di bloggarla: “Se il mio ViewModel espone una proprietà enumerativa, come posso bindarla ad un insieme di radio buttons ?”. La risposta sta nell’utilizzo di un converter. Partiamo dal ViewModel: 1: public enum Power {Low,Medium,High}
2:
3: public class TheViewModel
4: {...
Se siete sviluppatori WPF e volete iniziare a sviluppare su Silverlight e/o viceversa, sicuramente vi verrà utile questo documento che elenca in modo dettagliato (69 pagine) tutte le differenze tra le due tecnologie. Lo trovate qui: http://wpfslguidance.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=28278 Technorati Tags: WPF vs Silverlight
Visto il grande interesse che il pattern Model-View-Viewmodel sta (meritatamente) riscuotendo nelle communities WPF/Silverlight era inevitabile che qualcuno iniziasse a raggrupparne i blocchi fondamentali in frameworks/libraries/templates affinchè non sia necessario reinventare la ruota tutte le volte.
Tra le svariate implementazioni che ho visto nascere in questi mesi a parer mio le due più' interessanti sono:
Onyx www.codeplex.com/wpfonyx
Julmar Helper Library www.julmar.com/blog/mark/PermaLink,guid,8b3e4279-70a5-431e-8fa3-4c1e047df311.aspx
Quest'ultima e' la mia preferita ed e', oltre che una library fondamentale per M-V-VM, una raccolta infinita di tips and trick...
Da oggi creare un nuovo progetto WPF basato su Model View Viewmodel diventa veramente un gioco da ragazzi, infatti grazie al nuovo M-V-VM template per Visual Studio 2008 presente nel M-V-VM Toolkit, quello che basta fare è selezionare il relativo template: Fatto questo vi verrà chiesto se volete generare anche il progetto di test: E a questo punto vi ritroverete una semplicissima applicazione basta su M-V-VM che include tutta l’infrastruttura necessaria (ViewModelBase, DelegateCommand…). La cosa che più mi piace è la classe CommandReference introdotta per...
Affinchè i vari behaviors appaiono nell’asset library di Blend3 è necessario impostare un riferimento alla/e library che contengono i behaviors che ci interessano. In realtà è possibile averli tutti elencati nell’asset library e usarli direttamente delegando a Blend3 il compito di aggiungere i riferimenti necessari. Per far questo basta copiare le dll contenenti i behaviors in una cartella e aggiungere queste chiavi nel registry. Silverlight HKEY_CURRENT_USER\Software\Microsoft\Expression\Blend\v3.0\Toolbox\Silverlight\v3.0\<your name> WPF HKEY_CURRENT_USER\Software\Microsoft\Expression\Blend\v3.0\Toolbox\WPF\v3.0\<your name> ...
A volte può capitare di avere la necessità di dovere misurare le dimensioni di un testo e ritrovarsi orfani di Graphics.MeasureString/TextRenderer.MeasureText dei WinForms può portare a dei momenti di sconforto… L’equivalente WPF è: public Size Measure(string text, double fontSize, string typeFace)
{
FormattedText ft = new FormattedText(text,
CultureInfo.CurrentCulture,
FlowDirection.LeftToRight,
...
Dal blog di Jason Zander (General Manager, Visual Studio, Developer Division) ecco in anteprima il nuovo look di VS2010, interamente basato su WPF Fonte: http://blogs.msdn.com/jasonz/archive/2009/02/20/a-new-look-for-visual-studio-2010.aspx Technorati Tags: Visual Studio 2010
Tamir ha finalmente rivelato il suo progetto segreto: Simply amazing! FYI: Il tutto gira su un netbook con un Windows XP tailorizzato che ‘bootta’ più velocemente di un Nokia E71. Technorati Tags: WPF
Sul sito MSDN Italia è stato appena pubblicato un percorso formativo dedicato a Windows Presentation Foundation (WPF)interamente in Italiano. Visto che conosco chi li ha preparati vi posso anticipare che sono praticamente slide-less (solo dove proprio non se ne può fare a meno…) e molto demo oriented (robaccia tipo Visual Studio 2008 e Expression Blend per intenderci… ) Si parte da una overview per chi non ha mai visto WPF fino ad un webcast interamente dedicato a Model-View-ViewModel passando per argomenti quali Layouting, Commanding,Styling e Templating e ovviamente,...
Dal blog di Jamie Rodriguez, una serie di coding guidelines che, se sviluppate in WPF, sono un vero must. Le trovate qui: http://blogs.msdn.com/jaimer/archive/2009/01/13/xaml-guidelines-part-3-draft.aspx Technorati Tags: XAML Guidelines
Questo frammento di XAML non compila: <StackPanel>
<Button Width="100" Height="50" x:Name="btn1" Content="B1" />
<Button Width="100" Height="50" x:Name="btn1" Content="B2" />
</StackPanel>
il motivo è evidente: Non è possibile avere due elementi con lo stesso nome nel LogicalTree, proviamo quindi con questa alternativa:
<StackPanel x:Name="sp1">
<Button Width="100" Height="50" x:Name="btn1" Content="B1" Click="button1_Click" />
</StackPanel>
private void button1_Click(object sender, RoutedEventArgs e)
{
Button btn1 = new Button() { Name = "btn1", Width = 100, Height = 50, Content="B1" };
sp1.Children.Add(btn1);
}
e in questo caso...
A quanto pare anche il mondo Java si sta interessando a WPF… Fonte: eFace Technorati Tags: WPF,eFace
Come probabilmente saprete, nel recente WPF Toolkit è stato introdotta la prima preview del VisualStateManager per WPF, se volete utilizzalo direttamente in Expression Blend inserite questa chiave nel registro: [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Expression\Blend]"EnableVSM"=dword:00000001 Technorati Tags: VisualStateManager,Expression Blend 2.5
Una delle principali difficoltà nel passare dai Windows Forms a WPF è sicuramente quella di affrontare gli stessi problemi in maniera completamente diversa da come sono stati affrontati in passato, in pratica lo stesso problema di chi, dopo anni di VB6 decide di passare a VB 2008. Tra le tecniche che, lentamente, stanno ottenendo parecchio successo tra gli sviluppatori WPF c’è sicuramente l' "Attached Behavior" ovvero il racchiudere in una classe esterna una o più funzionalità applicabili in base alla necessità ai vari elementi che compongono una UI WPF. Consideriamo un caso tanto semplice, quanto...
Il vulcanico Karl Shifflet, recentemente entrato a far parte del team di Cider, ha realizzato una serie di PowerToys con lo scopo di migliorare alcune delle (molte) aree scoperte dal designer per WPF di Visual Studio 2008.
Le principali caratteristiche sono:
Group Into-Permette di selezionare un gruppo di controlli e raggrupparli in un nuovo parent
Remove Margins-Rimuove i margini da uno o piu' controlli
Create Business Form-Permette di creare velocemente un form di immissione dati
Edit Grid-Permette di editare righe e colonne di ua griglia
Create Business...
Non è un segreto che nella prossima release di WPF troveremo il supporto al VisualStateManager (già presente in Silverlight), nel caso vogliate un anteprima con relativo codice, cliccate qui. Inizialmente ero molto scettico sull’utilizzo di VisualStateManager rispetto ai Triggers (che spero comunque facciano il loro ingresso nella prossima versione di Silverlight) ma devo ammettere che l’utilizzo semplifica notevolmente la gestione dello stato di uno o più elementi. Technorati Tags: WPF,VisualStateManager
Posto qui la risposta al post di Igor cosicchè possa essere utile anche ad altri… Problema: Volendo definire un DataTemplateSelector e relativi DataTemplates in una class library, come risalgo ai DataTemplates definiti nel ResourceDictionary contenuto nella stessa assembly?. Quando si usa XAML spesso ci si dimentica che si ha a che fare con una classe parziale e che quindi è possibile aggiungere del codice semplicemente usando la direttiva x:Class, questo significa che riscrivendo il classico ResourceDictionary in questo modo: MyRd.xaml <ResourceDictionary
...
Il recente rilascio del service pack 1 di Visual Studio 2008 e del .NET Framework 3.5 introduce parecchie novità per lo sviluppatore WPF, ecco le principali partendo da quelle più evidenti, ovvero quelle inerenti il WPF designer integrato in VS 2008 (a.k.a Cider). Gestione degli eventi Le novità più evidenti sono visibili nella finestra delle proprietà (fig.1) dove finalmente è stata introdotta la possibilità di gestire gli eventi dei controlli secondo la stessa modalità delle applicazioni Winform (fig.2) La vecchia modalità che...
Visual Studio 2008 SP1 (Beta) .NET Framework Sp1 (Beta) Visual Basic 2008 SP1 (Beta) Visual Studio 2008 Team Foundation Server SP1 (Beta) Tutti i dettagli qui Technorati Tags: Visual Studio 2008 SP1,.NET Framework SP1
Su Codeplex è apparso un interessante progetto chiamato Transitionals. Il progetto consiste in una libreria che permette di applicare degli effetti di transizione da uno usercontrol all'altro il tutto semplicemente modificando il valore della proprietà Content dell'oggetto contenitore TransitionElement. Ecco un esempio di utilizzo: <Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:loc="clr-namespace:Transitions"
xmlns:transc="clr-namespace:Transitionals.Controls;assembly=Transitionals"
xmlns:transt="clr-namespace:Transitionals.Transitions;assembly=Transitionals"
x:Class="Transitions.Window1"
x:Name="Window"
Title="Transitions"
Width="640" Height="480">
<Window.Resources>
...
Posto qui una versione alternativa al recente post di Igor a dimostrazione che XAML può evitare l'uso del codice,a beneficio di chi non legge i commenti nei blogs... <Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="WpfApplication9.Window1"
x:Name="Window"
Title="Window1"
Width="640" Height="480">
<Window.Triggers>
<EventTrigger RoutedEvent="Window.Loaded">
<BeginStoryboard Name="MyStoryboard">
...
Per quelli di voi che hanno Webhost4Life come servizio di hosting e vogliono pubblicare la propria applicazione Silverlight 2.0, le operazioni per configurare il server sono: Attivare, ovviamente, il supporto a .NET per la directory che ospita il progetto (Io ho impostato il supporto a 3.0/3.5) Aggiungere al proprio sito il supporto all'estensione MIME xap nel pannello di controllo usando: MIME Type: application/x-silverlight-app Estensione: .xap Enjoy Silverlight 2.0 programming! Technorati Tags: Silverlight 2.0,Webhost4Life
Domenica mattina, giornata uggiosa..., quasi quasi mi faccio un Adorner. L'idea è quella di realizzare una demo che mostri come aggiungere delle informazioni di selezione (tipo designer) attorno al controllo che ha il focus e l'utilizzare un Adorner è sicuramente la soluzione migliore in quanto è un elemento associato a un UIElement che può renderizzare del contenuto in un layer che sta "sopra" lo UIElement associato, di fatto arricchendolo. Step 1: Create l'adorner ereditando dalla classe Adorner class MyAdorner:Adorner
{
/// <summary>
...
Se avete letto questo blog di ScottGu (che ultimamente ha più "ascolti" del Festival di SanRemo) noterete come il data model generi dei dati dummy a design time usando: if (HtmlPage.IsEnabled==false){...} Ma qual'è l'equivalente in "Full WPF"? Voilà! if (DesignerProperties.GetIsInDesignMode(new DependencyObject()))
{
LoadDummyData();
}
Lo è quello di avere dei dati fittizi da utilizzare per disegnare il relativo DataTemplate, peccato che Expression Blend si ostini a creare un ObjectDataProvider alla faccia di tutti i vari pattern MVC/MVP...
Technorati Tags:...
Leggendo il minicorso di ScottGu non ho potuto fare a meno di notare come SilverLight 2.0 nasca già con dei controlli che tutt'ora mancano in WPF come, ad esempio, la WatermarkedTextBox. Ho deciso quindi di crearmi un alternativa per full WPF.
Ho creato un controllo WatermakedTextBox ereditando da TextBox e aggiungendo una DependencyProperty Watermark
public class WatermarkedTextBox:TextBox
{
#region Watermark
/// <summary>
/// Watermark Dependency Property
/// </summary>
public static readonly DependencyProperty WatermarkProperty =
DependencyProperty.Register("Watermark",...
Continuo a pensare che il designer di WPF di VS2008 sia una delle note più dolenti di questo rilascio... Creo un nuovo progetto WPF Aggiungo un nuovo UserControl Inserisco, a manina, lo UserControl appena creato in Window1. (A manina perchè non è disponibile nella toolbox) Assegno, via PropertyGrid, un nome allo UserControl Compilo... Anzi No!, non compila! Questo lo Xaml... <Window x:Class="D00_Usercontrol.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:l="clr-namespace:D00_Usercontrol"
Title="Window1" Height="356" Width="574" MouseDown="Window_MouseDown">
...
E' stata rilasciato un aggiornamento (KB938660) che "dovrebbe" (il condizionale è ormai d'obbligo) migliorare le prestazioni delle applicazioni WPF, in particolar modo quelle legate alle layered Windows dove è possibile raggiungere un miglioramento del 400%. L' hotfix è disponibile qui. Technorati Tags: WPF,Performances
E chi l'ha detto che sviluppare un applicazione enterprise usando WPF non dà nessun valore aggiunto? Probabilmente quelli che non conoscendo una tecnologia la sconsigliano e che probabilmente sono gli stessi che dicono che Windows Vista non è ancora stabile e quindi meglio installare XP oppure NT4. Beh, io sono convinto che un applicazione come "Lawson Smart Client" sviluppata da Frog design, rispetto alla "classica" applicazione Windows Forms, può decisamente fare la differenza. Fonte: http://www.istartedsomething.com/20080109/frog-design-wpf-sexy-enterprise-software/ Technorati Tags: WPF,Enterprise Applications,Frog Design
XAMLPad è il "Notepad" di chi usa WPF. Ammetto di non averlo mai usato molto perchè ho sempre preferito la sua evoluzione XAMLPadX , ma ora che è uscita la versione 1.0 di Kaxaml credo che quest'ultimo diventerà il mio WPF quick editor di fiducia Technorati Tags: WPF,XAMLPad,XAMLPadX,Kaxaml
Implementare INotifyPropertyChanged non solo permette ad eventuali controlli WPF connessi ad una fonte dati di aggiornarsi quando il dato cambia ma evita anche che in alcune particolari situazioni il binding dia luogo a dei memory leaks. Il tutto è spiegato dettagliatamente in questa KB. Technorati Tags: WPF,WPF DataBinding
Di materiale in rete su WPF c’è né parecchio, faccio però fatica a trovare materiale riguardante un aspetto cruciale nelle realizzazione di una qualsiasi applicazione WPF: l’organizzazione delle risorse, dove col il termine risorse mi riferisco a qualsiasi cosa possa essere contenuta in un ResourceDictionary. Immaginiamo,ad esempio,di dovere visualizzare un immagine e utilizzare uno stile in una finestra con la possibilità di sostituirli successivamente senza modifica l’applicazione principale. Forti dell’esperienza maturata coi Windows Forms anche chi è digiuno di WPF può facilmente intuire che la soluzione consiste nel mettere immagine e stile in...
Finalmente qualcuno ha colmato una grande lacuna presente in WPF creando una serie di snippets che rendono meno noiosa la creazione di dependency properties, routed commands e routed events. Gli snippets sono ben organizzati e coprono tutte le varie possibili alternative, personalmente qualcuno me lo ero già creato ma questi sono decisamente meglio. Finalmente e complimenti a Dr. WPF! Technorati Tags: WPF,WPF Snippets
Karl del team di Mole mi segnala la disponibilità di una nuova release che da ora può essere utile anche a chi non usa WPF. Non avendo capito esattamente quale fosse il valore aggiunto per i non-WPF developers ho chiesto ulteriori dettagli e questa è la sua risposta: 1. Viewing collection data in Mole is MUCH easier than in Visual Studio. You also get two views for the same data. There are two examples of viewing collection data in the Code Project article. 2. Mole allows establishing Favorites to make...
Ammetto che mi ero quasi scordato che Chris mi aveva inviato una copia della nuova versione del suo libro su WPF, meglio così, trovare il pacco questa sera è stata una piacevole sorpresa. La prima edizione è stato il mio primo libro su WPF, ricordo ancora la ressa a PDC 2005 per acquistarlo e ammetto che, malgrado datato, alcune volte trovo ancora dei dettagli non citati in altri libri. Ho dato un occhiata veloce per vedere il livello di questa nuova versione di ben 832 pagine contro le 430 della precedente, e devo dire ho...
Con l'avvento di WPF si tende sempre di più a descrivere il ruolo del "designer" come quello di colui che si occuperà della user interface. La mia esperienza sembra confermare che, almeno inizialmente, questo ruolo verrà comunque comperto da un developer (magari quello col migliore senso estetico) ma non è escluso che in futuro, i ruoli diverrano ben definiti e coperti da diverse professionalità. Fin'ora, a parte la definizione dei ruoli, non si è mai visto come le due figure devono/possono interagire tra loro, e come un applicazione WPF debba essere realizzata affinchè questo sia realizzabile nel migliore...
E disponibile la December preview di Expression Blend 2, scaricabile qui. Technorati Tags: WPF,Expression Blend
Pochi giorni fa segnalavo questo visualizer per WPF, il team è in realtà iper-attivo e ha già rilasciato la release successiva: Mole II. Più sobrio rispetto al precedente e sopratutto: molto più veloce! Technorati Tags: WPF,Visualizer
Non sono un grande sostenitore delle animazioni di WPF (a parte le demo ovviamente, il pulsante che ruota è ormai un classico...) però in alcuni casi le animazioni possono dare un tocco di "eleganza" anche alla più statica delle applicazioni. Il frammento di codice che segue anima la proprietà StrokeDashOffset di un rettangolo racchiuso in un template associato attraverso FocusVisualStyle ottenendo l'effetto della classica linea animata che circonda il controllo col focus. <Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="FocusVisualStyle.Window1"
x:Name="Window"
...
Ricciolo questa volta si è superato, non solo si è messo ad analizzare lo spettro di un segnale audio con DirectShow, ma si è pure inventato un player WPF con relativi VU-Meter usando una tecnica da applauso. Attendiamo un articolo approfondito sull'intero progetto Technorati Tags: WPF,DirectShow
A giudicare dalla proliferazione di debugger visualizers l'interesse verso WPF sta crescendo...
Dallo stesso team di WoodStock e' ora il turno di Mole, a prima vista sembra molto simile al precedente, ma alcuni screenshot rivelano qualche funzionalita' aggiuntiva (es:la visualizzazione dello Xaml che descrive un elemento)
Tanto vale installarli entrambi...
Mole GUI:
Localizzare un applicazione WPF rappresenta sotto certi aspetti un salto nel passato. Dopo esserci abituati a Visual Studio e alla possibilità di localizzare un form semplicemente cambiando la proprietà Language, ora il gioco si fa decisamente più "duro".
Innanzitutto bisogna procurarsi i ferri del mestiere quindi oltre a Visual Studio 2008 bisogna scaricarsi l'esempio LocBaml (per la serie "fatelo da voi"...) e compilarselo.
A questo punto immaginiamo di avere un applicazione come quella in fig1 composta da una finestra con all'interno un semplice pulsante che quando premuto visualizza una MessageBox
fig.1
Il punto di partenza è modificare il file .csproj...
Immaginate di avere la necessità di eseguire un operazione ogni volta che l'utente preme un qualsiasi pulsante all'interno di un applicazione. Far questo in un applicazione Windows Form non è sicuramente banale, in WPF lo stesso risultato si può ottenere abbastanza facilmente grazie alla possibilità di sottoscrivere uno o più eventi esposti da una classe indipendentemente da dove venga poi utilizzata la relativa istanza. Immaginiamo di avere due window, ognuna con un pulsante e di voler loggare quando questi vengono premuti. Le operazioni da eseguire sono: ...
VB2008 parte col piede sbagliato per quanto rigurda WPF: Basta infatti creare una nuova applicazione WPF, premere F5 per avere un clamoroso errore di compilazione (se, da bravi programmatori avete attivato Option Strict On) Il problema sta nelle nuove WPF MyExtensions introdotte post Beta2 (e post RC) che qui falliscono a causa del cast implicito: <Global.System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")> _
Friend ReadOnly Property Application() As Application
Get
Return Global.System.Windows.Application.Current
End Get
End Property
Al momento la soluzione consiste nel aggiustare manualmente i templates...
Se avete visto un qualsiasi frammento di XAML è probabile che abbiate incontrato una markup extension, ovvero quelle particolari definizioni racchiuse tra parentesi graffe (es: {x:Null}). Oggi mi è venuto comodo visualizzare in un texblock il valore di un setting e per far questo ho sfruttato la possibilità di definire delle custom markup extensions semplicemente creando delle classi che ereditano da MarkupExtension. [MarkupExtensionReturnType(typeof(string))]
public class StringSettingExtension:MarkupExtension
{
public StringSettingExtension():base(){}
public StringSettingExtension(string propertyName)
{
if (string.IsNullOrEmpty(propertyName))
throw...
Quest'estate ho partecipato ad una virtual SDR (software design review) durante la quale il team di Acropolis mostrò le ultime novità e la direzione che intendevano seguire nello sviluppo del progetto. E' stata una lunga discussione durante la quale abbiamo avuto modo di mostrare tutte le nostre perplessità, fornire la nostra visione e il punto della situazione per quanto riguarda l'adozione di WPF nelle varie realtà locali.Da allora nessuna novità fino ad una comunicazione qualche giorno fa che anticipava l'annuncio che il progetto Acropolis è stato abbandonato per far posto a una nuova iniziativa denominata WPF Composite Client.Questa scelta non...
A volte una domanda a prima vista banale in realtà si rileva più complicata del previsto, nello specifico la domanda era: Come posso recuperare un controllo all'interno di un mio custom ValueConverter?. La prima risposta è stata quella di passare un riferimento all'elemento host attraverso ConverterParameter e poi usare il metodo FindName : ovvero usare qualcosa tipo: <Window.Resources>
<local:MyMultiValueConverter x:Key="mc" />
</Window.Resources>
...
<TextBox Text="{Binding Path=Title, Converter={StaticResource mc},
ConverterParameter={Binding...
Partiamo da un caso tanto semplice quanto comune: Una classe EventSource che genera un evento EventTriggered sottoscritto da un altra classe EventConsumer. EventSource: 1: class EventSource 2: { 3: public event EventHandler EventTriggered; 4: 5: public void DoRaise(){ 6: if (EventTriggered != null)EventTriggered(this, EventArgs.Empty); 7: } 8: ...
Uno degli aspetti meno conosciuti del databinding di WPF è la naturale gestione degli aggiornamenti nel caso questi avvengano da un thread secondario.Supponiamo di avere una fonte dati che quando il metodo QueryValue viene invocato aggiorni i propri dati attraverso un thread secondario in modo da non bloccare l'intera applicazione. class MyData:INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public int Value { get; set; }
public void QueryValue()
{
ThreadPool.QueueUserWorkItem(delegate(object o)
...
Tutti i dettagli qui. Technorati Tags: WPF, Blend
Tempo fa Charles Petzold nel suo blog aveva promesso di omaggiare con una copia del suo nuovo libro 3D Programming for Windows quelli che avrebbero risposto al suo appello. Beh, è stato di parola e oggi è arrivata la mia copia autografata. Non avendo ancora letto il libro non posso esprimere pareri, l'unica nota che posso aggiungere è che, questa volta, ci sono parecchie figure e gli esempi sono più contenuti rispetto al precedente libro su WPF. Non posso concludere che ringraziando l'autore: Thank you Charles! ...
Questo post nasce da una domanda di Igor, posto qui il risultato affichè possa essere d'aiuto ad altri.L'obiettivo è quello di aggiornare il contenuto di uno Statusbaritem quando le varie texbox contenute in una window prendono il focus, il testo da riportare è contenuto nella proprietà Tag delle singole Textbox.In alternativa al classico routed event a livello di Window, una soluzione interessante nasce dal fatto che ad uno stile è possibile associare un evento che verrà invocato allo scattare del relativo Trigger attraverso la tag EventSetter.Di seguito lo XAML e il codice: 1: ...
Su Codeplex è apparsa una libreria di controlli WPF chiamata WPF Contrib. Controls: NotifyIcon, ImageStrip, NineGridBorder Panels: AutoGrid, ColumnStackPanel Converters: DarkColorConverter, LightColorConverter, FormattedTextConverter Dialogs: FolderBrowserDialog, TaskDialog Utilities: BindingHelpers, ColorHelpers, DependencyHelpers, AnimationHelpers, UIHelpers Animation: Animation Framework Themes Non ho ancora avuto modo di provarli ma, a prima vista, sembrano interessanti. Technorati Tags: WPF, WPF Controls
Partiamo da un (cattivo) esempio: Una combo bindata a 10000 elementi. Code 1: public partial class ComboWithVirtualStackPanel : System.Windows.Window 2: { 3: public ComboWithVirtualStackPanel () 4: { 5: InitializeComponent(); 6: 7: ObservableCollection<string> data = new ObservableCollection<string>(); 8: ...
Come sapete ad uno style è possibile associare un trigger, l'esempio che segue, ad esempio, cambia il colore di sfondo della textbox quando questa ha il focus.
1: <Style TargetType="{x:Type TextBox}">
2: <Setter Property="FontFamily" Value="Tahoma" />
3: <Setter Property="Margin" Value="10" />
4: <Style.Triggers>
5: <Trigger Property="IsFocused" Value="True">
6: <Setter Property="Background" Value="LightGreen" />
7: </Trigger>
8: </Style.Triggers>
9: </Style>
A questo punto la domanda è: Come faccio a impostare un trigger con una condizione che...
Prendete questo frammento di XAML generato da Cider, a questo punto vi chiedo: Se premo btn che succede?
1: <Grid> 2: <Button Name="btn">Button</Button> 3: </Grid>La risposta è "dipende" se il progetto è VB9 allora potrebbe essere eseguito dell'eventuale codice perchè il default handler generato è dichiarato in questo modo:
1: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click 2: ... 3: End Sub
Ovviamente C# genera questo XAML:
...
Non ho mai considerato seriamente Cider (il designer delle applicazioni WPF integrato in Visual Studio 2008), troppe limitazioni, troppi "Whoops" (e io non sono manco un fan di Britney Spears...) tantè che l'ho sempre rimpiazziato con il buon editor xml di Visual Studio.Con la beta 2 mi sono deciso a dargli un occhiata più "seria" e, con mio profondo rammarico, mi sono reso conto che ci sono ancora moltissime limitazioni e, considerato che siamo in Beta2, a meno di ecclatanti colpi di scena, immagino che questo sarà lo stato dell'arte per la release 1 di questo nuovo designer. Pro ...
E' disponibile la August preview di Expression Blend che ha, tra le nuove features, quella di poter aprire progetti WPF direttamente in Visual Studio 2008™ Beta2. Altre novità: Make User Control Expression Blend 2 August Preview contains an early look at new functionality that lets you re-factor existing content into a control that can be reused (instantiated). Currently, only selected elements—and their referenced resources—can be re-factored into the new control. Any referenced animations are currently lost, but the current plans for next release are to preserve these as well. You also need to build the project to be able...
Durante la mia sessione ai recenti CommunityDays 2, Igor ha notato un dettaglio che hai più era sfuggito, ovvero che la listbox utilizzata durante le varie demo aveva il colore dell'item selezionato diverso rispetto al classico blu.Qui trovate la soluzione di Igor al problema (decisamente più completa), di seguito l'equivalente "quick & dirty". Credo che l'aspetto più interessante sia nel capire che è possibile ridefinire le risorse eventualmente impiegate all'interno di templates.
1: <LinearGradientBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" StartPoint="0,0.1" EndPoint="1,0.1"> 2: <GradientStop Color="LightGreen" Offset="0.0" /> ...
Duarnte in recenti Community Days, ho mostrato come in WPF sia possibile associare ad un binding delle regole di validazione in maniera dichiarativa:.
1: <TextBox Validation.ErrorTemplate="{StaticResource validationTemplate }"> 2: <TextBox.Text> 3: <Binding Path="Name"> 4: <Binding.ValidationRules> 5: <ExceptionValidationRule /> 6: </Binding.ValidationRules> 7: </Binding> 8: </TextBox.Text> 9: </TextBox>
In questo...
A questo indirizzo trovate un chilometrico hands-on-lab (90 pagine di manuale!) su come realizzare un clone di Outlook 2007 usando Expression Blend e WPF.Ho dato un occhiata veloce, mi pare ben fatto e sopratutto dimostra (finalmente) come realizzare un applicazione "business style" con Window Presentation Foundation.
Usando Blend ho notato una "piccola" differenza di comportamento tra WPF e le applicazioni Winform in presenza di eccezione non gestita.Immaginiamo di avere un Windows Form con un pulsante con al suo interno associato a questo questo codice:.
1: private void button1_Click (object sender, EventArgs e) 2: { 3: int[] data = new int[2]; 4: data[3] = 42; 5: }
Compilando e lanciando l'eseguibile otterremo la solita...
In WPF il valore di una dependency property può essere determinato da diversi fattori,ad esempio potrebbe essere impostato via stile, databinding oppure modificato attaraverso il meccanismo di Coercing che le dependency property offrono.Sta di fatto che a volte una proprietà non ha il valore che ci aspettavamo ed è difficile capire chi la sta controllando. La classe DependencyPropertyHelper ci da una mano.
1: ValueSource vs=DependencyPropertyHelper.GetValueSource(txtQuantity, TextBox.TextProperty);
In questo caso ValueSource conterrà una serie di informazioni utili tipo: IsAnimated,IsCoerced e IsExpression,mentre analizzando l'enumerato esposto da BaseValueSource otterremo l'informazione di chi sta impostando attualmente quella proprietà....
WPF fa largo uso di templates grazie ai quali è a volte possibile evitare la creazione di controlli custom.L'esempio che segue mostra come modificando il template associato ad una listbox è possibile ottenere una listbox con una microfunzionalità di editing dell'item selezionato. Template
1: <Window.Resources> 2: <Style TargetType="{x:Type ListBox}"> 3: <Setter Property="Template"> 4: <Setter.Value> 5: ...
Le attached properties sono un meccanismo "furbo" per arricchire elementi WPF con proprietà che, sebbene memorizzate nell'oggetto stesso, sono definite in un altro elemento.Supponiamo di avere la necessità di aggiungere ad un Button una proprietà CustomValue ed usarla in XAML.Definisco una classe ButtonExtender che espone un attached property CustomValue: .
1: namespace D00C.AttachedProperties 2: { 3: public static class ButtonExtender 4: { 5: public static readonly DependencyProperty 6: ...
Charles Petzold in questo post sul suo blog indica che usa spessisimo le dependency properties, anche quando queste "non devono far altro che essere usate come sorgente di Binding".Inutile dire che sono contrario a questo approccio, definire delle business entities che espongono delle Dependency Properties impongono che l'entity stessa derivi da DependencyObject legando inesorabilmente l'entity stessa a WPF quando il suo utilizzo potrebbe essere condiviso da tecnologie diverse (es: ASP.NET o Compact Framework)Visto che le sorgenti di binding in WPF non devono necessariamente essere delle dependency properties, l'uso delle varie alternative, come la più comune implementazione di INotifyPropertyChanged è, secondo me, da...
Volete imparare ad usare Expression Blend? qui trovate un corso online gratuito che insegna l'ABC di questo nuovo tool con il quale sicuramente i "DEVsigners" dovranno imparare a convivere.
Roxio ha reso disponibile una preview della nuova suite di masterizzazione interamente scritta in WPF, ed è forse il primo caso di applicazione consumer scritta usando la nuova tecnologia.Un altro segnale per tutti i deterrenti che, dopo aver visto WPF, affermano: "Si, ma ai miei clienti non interessano queste cose, i Windows Forms (per non dire VB6), vanno più che bene..."
Che il mercato dedicato a WPF sia in espansione è sotto gli occhi di tutti, segno che la tecnologia, lentamente, comincia a prendere campo.Tra i nuovi produttori segnalo IdentityMine (nome noto nel settore) che attraverso blendables.com offre una serie di tools che non si limitano alla sola interfaccia utente.
Così come a volte WPF complica alcune cose che nei Windows Forms sono banali ci sono situazioni dove avviene il contrario.Un esempio è il caso di una Listview come quella riportata qui sotto: Lo Xaml necessario è il seguente:
1: <StackPanel Margin="8"> 2: <ListView Name="listView" ItemsSource="{Binding}"> 3: <ListView.View> 4: <GridView> 5: ...
Charles Petzold nel suo blog commenta con un certo sarcasmo il confronto apparso sul sito CodingHorror tra il suo libro e quello di Adam Nathan.Sono un estimatore di Petzold da parecchio tempo il suo libro Programming Windows 3.1 è stato per me un faro nella nebbia e ancora traggo beneficio dalla sua lettura.Sebbene continui a consigliare l'acquisto del suo libro non posso, in questo caso, non essere dalla parte di chi ritiene il libro di Nathan migliore. Non solo il libro di Nathan è piacevole da leggere (forse Petzold dovrebbe ricordare che non sempre si è di fronte al PC quando...
Un breve esempio (nato da una domanda nel NG MS) su come salvare su disco il contenuto di una Window WPF. .
1: using System.Windows.Media.Imaging; 2: using System.IO; 3: 4: RenderTargetBitmap bmp = new RenderTargetBitmap(300, 200, 120, 96, PixelFormats.Pbgra32); 5: bmp.Render(this); 6: BmpBitmapEncoder encoder = new BmpBitmapEncoder(); 7: encoder.Frames.Add(BitmapFrame.Create(bmp)); 8: ...
Ovviamente quanto cerchi di fare una cosa semplice semplice, Murphy suona alla tua porta...Obiettivo: Usare XAML per associare degli enumerati a dei ComboboxItems..
1: public class MyClass 2: { 3: public enum MyEnum { V1, V2, V3 }; 4: }
Con relativo XAML...
.
1: <Window x:Class="WPF.BindingToStatic.Window1" 2: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4: ...
Per coloro che seguono WPF segnalo questo interessante sito di FAQ relative a Windows Presentation Foundation. E' nato da poco ma l'inizio è già promettente...
Oggi nel preparare una demo sulle animazioni di WPF ho pensato di creare un animazione che facesse lampeggiare un controllo in una finestra, operazione a prima vista banale...Problema 1: La visibilità di un controllo è un enumerato di tipo Visibility come lo "animiamo"? Fortunatamente ho scoperto la presenza di una generica animazione ObjectAnimationUsingKeyFrames percui l'operazione è stata abbastanza semplice: 1: <Window.Resources> 2: <ObjectAnimationUsingKeyFrames Duration="0:0:1" x:Key="an1" RepeatBehavior="Forever"> 3: <DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{x:Static Visibility.Visible}" /> 4: ...
Una delle grosse mancanze di WPF v1.0 sta finalmente per essere colmata.Xceed ha annunciato l'imminente rilascio di una griglia 100% WPF e, a quanto pare, non sarà una lite edition.Il tutto rigorosamente free. Se siete interessati, potete registrarvi qui Update 26/1: Il prodotto è stato rilasciato, è disponibile un interessante demo, dimensione del pacchetto: oltre 60 MB!
Tutto ha un inizio e WPF (Windows Presentation Foundation) non è da meno, allora perchè non iniziare da un articolo introduttivo a WPF?
Utilizzando l'oggetto CollectionView e la proprietà GroupDescriptions è possibile suddividere in gruppi l'insieme di elementi di cui la CollectionView è la vista.GroupDescriptions consente di definire la proprietà che verrà usata come termine di raggruppamento, ma se volessimo raggruppare secondo un criterio proprietario?In questo caso dobbiamo creare la CollectionView usando l'oggetto CollectionViewSource (il quale ritornerà, in base al tipo di insieme associato una CollectionView o una ListCollectionView a seconda se l'insieme passatogli implementa ICollection oppure no) associandogli un custom Converter. Supponiamo di avere una ObservableCollection<Product> (products), che Product abbia una proprietà Price e di volere raggruppare i prodotti tra quelli che hanno prezzo...
Nel preparare la demo per il prossimo WorkShop mi sono reso conto che in WPF la proprietà IsDisposed esposta dalla classe Form non esiste nella classe Window di WPF.Sebbene sia facilmente riproducibile e internamente Window mantenga un field IsDisposed, la soluzione più veloce sembra essere: private bool IsDisposed(Window window){ return PresentationSource.FromVisual(window).IsDisposed; } La quale può essere applicata a qualsiasi elemento che eredita dalla classe astratta Visual, tra questi, la classe Control.
Assistento a qualche demo di applicazione WPF sarete stati quasi certmente vittime della novità più "evidente": le animazioni.Le animazioni di WPF non sono poi così diverse da quelle ottenibili nelle applicazioni WinForm, entrambe si ottengono modificando dinamicamente il valore di una o più proprietà di un elemento di UI, quello che distingue WPF è il mettere a disposizione una serie di classi che rendono la modifica più semplice rispetto all'equivalente Windows Forms 2.0.Le classi di animazione sono divise in due gruppi e utilizzano un naming ben preciso: <Type>Animation e <Type>AnimationUsingKeyFrames dove <Type> rappresenta il tipo della proprietà da animare.Supponendo di voler animare...
Questo XAML: <StackPanel> <TextBox Name="txt1" /> <TextBox Name="txt2" Text="{Binding ElementName=txt1, Path=Text, Mode=OneWay}" /></StackPanel>Fa in modo che modificando il testo di txt1 venga automaticamente aggiornato il contento di txt2 ma non viceversa, a causa della modalità OneWay (Sorgente->Destinazione) indicata nel binding.Il tutto funziona fino a quando non andate manualmente a modificare il contenuto di txt2, fatto questo il binding cessa di esistere e quindi le textbox sono a tutti gli effetti indipendenti.Questo è un comportamento voluto e ben descritto qui.
Le funzionalità tipiche di un applicazione WinForm (ad esempio il Copia/Incolla) sono normalmente implementate sottoscrivendo l'evento Click generato da un menu o dall'equivalente pulsante nella toolbar. A seconda del contesto di esecuzione è poi possibile che l'evento venga trattato diversamente, ad esempio copiando del testo in un caso oppure un oggetto nell' altro.In WPF le cose sono gestite diversamente: Anzichè mappare i clicks provenienti dai controlli è stato introdotto il concetto di comando con lo scopo di separare nettamente l'esecuzione dal relativo chiamante come indicato nel pattern Command.Un comando può essere associato ad un FrameworkElement che quindi scatenerà un azione che percorrerà tutto il Logical Tree sottoforma di RoutedEvent alla ricerca di un...
Nel precedente post ho mostrato come è facile connettere UI e dati in WPF, a questo punto ci si può domandare: Ma come avviene la conversione tra il tipo esposto dalla proprietà sorgente e quello di destinazione?La rispostà è attraverso dei TypeConverters i quali hanno il compito di convertire il tipo sorgente in quello destinazione, nel caso specifico dell'esempio precendente il converter utilizzato è uno StringConverter.Ma se dovessimo mettere in binding una proprietà di tipo Custom?: In questo caso dobbiamo associare al Binding un nostro TypeConverter definendo una classe che implementa IValueConverter.La creazione di un custom converter si rende necessaria anche...
Con WPF finalmente il databinding diventa parte integrante dell'architetturà anzichè essere una realtà di contorno come lo è tutt'ora nel mondo WinForm (anche se con la versione 2.0 del FX ci sono stati parecchi improvements).Tra le svariate novità mi piace molto quella di poter agganciare tra loro i vari controlli semplicemente usando l'attributo ElementName per indicare la fonte di Binding. <CheckBox x:Name="chkEnable" Content="Advanced..." /> <GroupBox Header="Options" IsEnabled="{Binding ElementName=chkEnable, Path=IsChecked}"> <Button Height="75" Width="100">Apply</Button></GroupBox> In questo caso l'abilitazione del GroupBox (IsEnabled) dipende dal valore della proprietà IsChecked del controllo chkEnable, il tutto si ottiene mettendo in Binding la proprietà IsChecked del...
Ogni FrameworkElement espone una proprietà Resources che contiene tutte le risorse associate, la proprietà è di tipo ResourceDictionary che fondamentalmente è una HashTable ottimizzata in quanto gli item contenuti vengono parsificati on demand.Sebbene sia possibile definire le risorse a livello di FrameworkElement essendo solitamente le risorse condivise tra le varie parti che compongono l'applicazione solitamente queste vengono definite o all'interno di una Window oppure direttamente a livello di applicazione nel file App.xaml. <StackPanel> <StackPanel.Resources> <LinearGradientBrush x:Key="b1" StartPoint="0,0" EndPoint="1,1"> <LinearGradientBrush.GradientStops> <GradientStop Color="RoyalBlue" Offset="0"/> <GradientStop Color="Aqua" Offset="1"/> </LinearGradientBrush.GradientStops> </LinearGradientBrush> <CheckBox x:Key="c1" HorizontalAlignment="Center">Ciao</CheckBox> <ControlTemplate x:Key="i1"> <Image Source="Giulia.jpg" Width="150" Height="100"/> </ControlTemplate> </StackPanel.Resources> ...
Il meccanismo di funzionamento degli eventi in WPF è cambiato non poco, questo ovviamente a causa delle potenzialità di composizione che WPF mette a disposizione.In WPF al concetto di evento è stato associato l'aspetto Routing, ovvero quando un determinato elemento genera un evento, questo segue un percorso ben preciso fino a quando un determinato gestore informa il sistema che il propagare dell'evento non è più necessario.La strategia di routing si divide in Bubbling e Tunneling BubblingQuando un elemento genera un evento questo viene propagato al proprio parent fino al raggiungimento del root element, ogni elemento può decidere di gestire l'evento ed...
La classe Control espone una proprietà Template che permette di ridefinire il Visual Tree associato, in parole povere è possibile stravolgerne la UI mantenendo inalterato il comportamento.Ci sono varie alternative per agire sulla proprietà, un metodo possibile è quello inline: <Button> <Button.Template> <ControlTemplate> <CheckBox>Hello</CheckBox> </ControlTemplate> </Button.Template></Button>Ottenendo in questo caso un button che si presenta come una checkbox (???)La modalità comune di utilizzo di un template è comunque attraverso gli stili, non a caso nel SDK si trova la descrizione dei vari stili utilizzati dai controlli comuni(button, checkbox, listbox...) Un esempio di stile, applicato al tipo Button è la seguente <Style TargetType="{x:Type...
Leggendo i miei ultimi post relativi a WPF alcuni lettori del mio blog mi hanno scritto chiedendomi:"Ma per sviluppare un applicazione WPF devo per forza imparare a scrivere tutto lo XAML a manina?, non esisteranno dei designers che si occuperanno di generare tutto lo XAML necessario?"La mia risposta è: "Nì", in quanto:
I designer già ci sono:Cider- Il designer integrato in OrcasExpression Interactive Designer - Il tool esterno pensato per i designers di applicazioni WPFZAM3D - Tool specializzato nella parte 3DAurora - E' stato il primo designer di applicazioni WPF, sviluppato da MobiformPurtroppo, almeno per quanto riguarda Cider e EID anche le...
Attraverso gli stili statici è possibile centralizzare in un unico punto il look & feel di un applicazione col grande vantaggio che, agendo semplicemente sullo stile, possiamo "rivoluzionare" la user interface del nostro progetto, e questo gli sviluppatori WEB lo sanno benissimo... Gli stili posso però anche essere dinamici, ovvero applicati solo al verificarsi di determinate condizioni quali Il variare di una proprietà. Lo scatenarsi di un evento. Il cambio di valore di una proprietà Databound. esempio <Style x:Key="DerivedStyle2" BasedOn="{StaticResource Style1}"> <Setter Property="Button.Background" Value="Lime" /> <Style.Triggers> <Trigger Property="Button.IsMouseOver" Value="True"> <Setter Property="Button.Background" Value="Blue" /> <Setter Property="Button.Foreground" Value="White" /> <Setter...
Con WPF viene introdotto un concetto da tempo noto agli sviluppatori WEB: lo Style.La classe FrameworkElement, dalla quale i controlli WPF ereditano espone infatti una proprietà Style impostando la quale è possibile decidere come apparirà un ben preciso elemento. Ad esempio è possibile definire lo stesso pulsante usando: <!--Classic Mode...--><Button Height="100" FontSize="14" Content="1" /> <!--Inline styling--><Button Height="100">1 <Button.Style> <Style> <Setter Property="Button.FontSize" Value="14" /> </Style> </Button.Style></Button>I due frammenti XAML sono equivalenti, ma è evidente che il secondo oltre ad essere molto più verboso non sfrutta la caratteristica fondamentale per la quale ha senso utilizzare uno stile: Il poterlo definire in un punto ben...
In WPF ogni UIElement espone una proprietà RenderTranform alla quale possiamo associare un oggetto Tranform o che eredita da esso che ci consente di modificare la modalità di rappresentazione dell'elemento una volta renderizzato, ad esempio applicando un RotateTranform possiamo ruotare un elemento o tutti quelli contenuti nel proprio logical tree.
<StackPanel Orientation="Horizontal" orizontalAlignment="Center">
<Button Height="100" Width="80" Content="Hello" />
<Button Height="100" Width="80" Content="World">
<Button.RenderTransform>
<ScaleTransform ScaleX="1.5" ScaleY="1.5" CenterX="50" CenterY="40" />
< span>Button.RenderTransform>
...
Nel precedente post ho accennato ad alcuni tipi di Brush disponibili in WPF, volutamente non ho indicato quello più interessante che è VisualBrush ovvero una Brush che può contenere tutto ciò che eredita da Visual, in pratica quesi tutto quello che è possibile includere in una user interface WPF.In pratica possiamo decidere di usare come colore di sfondo di un controllo, un altro controllo o un insieme di Controlli/Visual.Modificando dinamicamente attraverso Databinding lo sfondo disegnato mediante VisualBrush si possono ottenere effetti interessanti, queste poche righe di XAML mostrano due Texbox, quella sulla destra mostra il contenuto speculare della texbox di sinistra. ...
In WPF le varie proprietà BackGround, ForeGround, Stroke, Fill... che specificano alcune caratteristiche visive tipiche dei controlli, sono di tipo Brush, concetto conosciuto dai tempi di Win32 e presente nel FX 2.0.Oltre alla classica SolidColorBrush, che identifica un pennello di colore uniforme troviamo anche altri tipi di Brush già noti quali LinearGradientBrush e RadialGradientBrush.L'esempio che segue crea una textbox con lo sfondo sfumato: <TextBox Width="200" Height="40" Text="Hello!" FontSize="14" Margin="10"> <TextBox.Background> <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1"> <LinearGradientBrush.GradientStops> <GradientStop Color="#FFFF0000" Offset="0" /> <GradientStop Color="#7FFF0000" Offset="0.5" /> <GradientStop Color="#00000000" Offset="1" /> </LinearGradientBrush.GradientStops> </LinearGradientBrush> </TextBox.Background></TextBox>L'esempio è abbastanza semplice: La proprietà Background è associata in questo caso ad un LineadGradientBrush...
Nel precedente post avevo accennato al fatto che in WPF alcune proprietà hanno un significato solo se inserite all'interno di un ben preciso contesto, ad esempio le proprietà Left e Top hanno senso solo se inserite in un oggetto che permette il posizionamento assoluto, nello specifico, un oggetto di tipo Canvas mentre sono inutili se lo stesso controllo è all' interno di un DockPanel.Considerata la flessibilità di composizione che WPF mette a disposizione, pensare di inserire tutte le possibili proprietà in un controllo è improponibile, ecco il perchè sono state inserite le Attached Properties.Per posizionare un pulsante ad una determinata posizione lo XAML che...
I controlli Windows Forms sono organizzati secondo una ben precisa architettura all'interno della quale la classe Control assume un ruolo determinante, non a caso in questa classe che sono racchiuse le proprietà tipiche di ogni controllo, proprietà che di conseguenza troviamo in tutte le classi che ereditano da essa, anche se, a volte, totalmente prive di significato.Ad esempio, la classe ListView espone anch'essa una proprietà Text che, in questo caso, non serve assolutamente a nulla e, per evitare che venga usata, nel framework è decorata con [EditorBrowsable.Never] in modo che non appaia nell'intellisense.Applicare lo stesso criterio in WPF sarebbe stato impraticabile per una...
Anche i controlli WPF sono soggetti a thread affinity, questo significa che, come nei controlli WinForm attuali, non possiamo accedervi da un thread diverso da quello che ha creato il controllo stesso.Il motivo percui questo vincolo è rimasto è perchè rendere i controlli thread-safe sarebbe stato eccessivamente complesso anche alla luce del fatto che il più semplice dei controlli WPF è notevolmente più complesso se messo a confronto con la controparte WinForm, inoltre l'introdurre logiche di sincronizzazione di accesso avrebbero introdotto delle inaccettabili penalizzazioni a livello di performances.In WPF quasi tutte le classi che interagiscono con la UI (inclusi quindi tutti i vari...