agosto 2006 Blog Posts
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>
...
Se l'argomento threading vi interessa, ecco un interessante E-book (gratuito) disponibile sia online che in versione pdf (76 pagine)Fonte: Roy Osherove's Blog
Capita di dovere scorrere il contenuto di una lista generica e in base ad alcune condizioni rimuovere alcuni items.Dim list As New List(Of Byte)list.AddRange(New Byte() {10, 20, 30, 40}) For Each b As Byte In list If (b < 25) Then list.Remove(b)Next Il problema è che rimuovendo l'item la collezione viene modificata e quindi non è più possibile enumerarla.Usando List.RemoveAll associato al relativo Predicate(Of T) il problema non si pone. list.RemoveAll(AddressOf RemoveAllInternal) Private Function RemoveAllInternal(ByVal b As Byte) As Boolean Return b < 25End FunctionOvviamente con C# e gli anonymous delegates il codice è ancora più elegante. List<Byte> list=new...
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...
Se la vostra installazione di VB 2005 e' particolarmente lenta durante il debugging, nell'uso dell' intellisense oppure nel refresh della Error List forse avete bisogno di questa hotfix.Ovviamente la stessa fara' parte del prossimo SP1 di Visual Studio 2005.
Volete customizzare i commenti XML che VB2005 propone dopo che avete premuto ''' (3 volte apice) all'interno dell'IDE di VS2005?Copiate e personalizzate questo file xml all'interno della directory \Documents and Settings\Application Data\Microsoft\VisualStudio\8.0.Ad esempio, il file aggiunge un tag quando aggiungete i commenti xml ad una classe.Al momento non sono a conoscenza di un trick analogo per C#, se qualcuno lo conosce si faccia avanti...
Per quelli che, come me, sono appassionati di Internet Radio segnalo questo interessante internet radio player , leggero, veloce e include moltissime radio da tutte le parti del mondo e, se volete, potete registrare lo stream su disco.Purtoppo, per problemi di licensing non supporta le emittenti che usano il solo formato real-audio, però in compenso supporta tutti i plug-ins di WinAmp (ecco alcuni esempi) ,la funzione "What I'm listening to" di Messenger 8.0 e, sopratutto, e completamente free.Giusto per non "OTare" troppo: è scritto in C++ via STL, Windows API e un poco di MFC...