WPF Attached Behaviors


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 frequente: Selezionare il contenuto di una TextBox quando questa ottiene il focus.
Se fossimo nel mondo WinForms avremmo diverse possibilità per raggiungere lo scopo, dal mappare l'evento Enter su una routine comune, al creare un controllo custom che arricchisce il controllo base con la nuova funzionalità.
Entrambe le soluzioni sono applicabili in WPF, entrambe però hanno, come nei WinForm, dei punti deboli: il primo non è molto riutilizzabile mentre il secondo è forse un pò troppo complesso per un operazione cosi banale.
In WPF si usa risolvere questo genere di problematiche utilizzando una tecnica denominata Attached Behavior che sfrutta le potenzialità offerte dalle Dependency Properties abbinando Attached Properties con PropertyChangedCallback.
Creiamo quindi una classe TextBoxBehavior e aggiungiamo a questa un attached property denominata AutoSelectText

public static class TextBoxBehavior
{ 
  public static bool GetAutoSelectText (TextBox textBox)
  {
    return (bool)textBox.GetValue(AutoSelectTextProperty);
  }
  public static void SetAutoSelectContents (TextBox textBox, bool value)
  {
    textBox.SetValue(AutoSelectTextProperty, value);
  }
  public static readonly DependencyProperty AutoSelectTextProperty =
      DependencyProperty.RegisterAttached(
      "AutoSelectedContents",
      typeof(bool),
      typeof(TextBoxBehavior), 
      new UIPropertyMetadata(OnAutoSelectedChanged));

  static void OnAutoSelectedChanged (DependencyObject sender, DependencyPropertyChangedEventArgs e)
  {
    //Get source
    TextBox source = (sender as TextBox);      
    //Null means property is not attached to a TextBox
    if (source == null) return;
    if ((bool)e.NewValue)
      source.GotFocus += HandleGotFocus;
    else
      source.GotFocus -= HandleGotFocus;
  }

  static void HandleGotFocus (object sender, RoutedEventArgs e)
  {
    TextBox source = (sender as TextBox);
    source.SelectAll();
  }
}
 

Come potete notare la ‘magia’ sta nel sottoscrivere gli eventi che ci interessando nel metodo associato a PropertyChangedCallback che verrà invocato non appena l' Attached Property verrà inizializzata dal parser XAML.
A questo punto non ci rimane che aggiungere la funzionalità alle textbox nello XAML (vedi sotto) estendendo, di fatto, il controllo con una soluzione riutilizzabile che non coinvolge la parte dichiarativa in dettagli legati alla funzionalità a run-time.

<Window x:Class="AttachedBehaviorDemo.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:m="clr-namespace:AttachedBehaviorDemo" Title="Window1" Height="300" Width="300"> <StackPanel> <TextBox m:TextBoxBehavior.AutoSelectContents="True" Height="21" Margin="10,10" Text="Test1" /> <TextBox m:TextBoxBehavior.AutoSelectContents="True" Height="22" Margin="10,10" Text="Test2" /> </StackPanel> </Window>

 

Technorati Tags: ,

author: Corrado Cavalli | posted @ lunedì 1 settembre 2008 17.37 | Feedback (0)

XAML Power Toys


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 Form for Class-Crea un form di immissione dati partendo dalla business class

Mi auguro che l'ingresso di Karl nel team contribuisca a far crescere un prodotto tanto interessante, quanto immaturo, qual'e' Cider.

 

author: Corrado Cavalli | posted @ lunedì 1 settembre 2008 10.14 | Feedback (0)

.NET Framework: Le dimensioni contano…


Effettivamente c’è molta confusione sulle dimensioni reali del .NET Framework…, l’unica certezza è che, versione dopo versione, le dimensioni aumentano e, allo stato attuale, le dimensioni sembrerebbero circa 200 MB.
In realtà non è proprio così, o almeno non è vero che per installare da zero il .NET Framework SP1 sia necessario scaricarsi tutti i 200 MB.
Questo post di Scott Hanselman chiarisce ogni dubbio e, se volete capire quanti MB dovete scaricare per aggiornare una qualsiasi macchina, potete andare su www.smallestdotnet.com

Technorati Tags:

author: Corrado Cavalli | posted @ domenica 24 agosto 2008 21.42 | Feedback (1)

Reflector passa a Red-Gate


Il tool per .NET più famoso della terra abbandona il suo papà storico Lutz Roeder e passa al gruppo Red-Gate, la buona notizie è che in ogni caso, il tool rimarrà free.

Fonte: The future of .NET Reflector

Technorati Tags:

author: Corrado Cavalli | posted @ mercoledì 20 agosto 2008 10.35 | Feedback (0)

WPF Text Clarity


Una delle maggiori lamentele rivolte a WPF riguarda il rendering del testo, sopratutto in caso di piccole dimensioni dove il testo appare effettivamente leggermente “sfuocato” rispetto alla controparte GDI+
Se siete curiosi di capire il perchè di questo problema ed eventualmente come ‘mitigarlo’ leggete questo articolo.

Technorati Tags:

author: Corrado Cavalli | posted @ martedì 19 agosto 2008 22.35 | Feedback (1)

Client Profile Deployment Survival Guide


Se avete intenzione di utilizzare la nuova modalità di distribuzione Client Profile e sopratutto volete ridistribuire il Client Framework insieme alla vostra applicazione, non perdetevi questo link

Technorati Tags:

author: Corrado Cavalli | posted @ martedì 19 agosto 2008 17.45 | Feedback (0)

[.NET FX SP1] Eseguire codice managed da uno share di rete


Col SP1 si può! e senza necessariamente impostare i criteri di sicurezza per lo share interessato.
La motivazione è semplice: Impedirlo non aggiungeva nessuna sicurezza in quanto Windows comunque permette l’esecuzione di applicazioni unmanaged.

Fonte: qui

Technorati Tags:

author: Corrado Cavalli | posted @ giovedì 14 agosto 2008 11.54 | Feedback (4)

Hosting Non-HTTP WCF services on WAS


Ieri ho perso gran parte del pomeriggio cercando di capire perchè un banalissimo servio WCF che usa TcpBinding ospitato in IIS7 non volesse funzionare, dopo aver ricontrollato l’impossibile e aver cercato in tutti i siti della terra ho desistito sperando nell’effetto “la notte porta consiglio” e in effetti, questa mattina, di buon ora, ho ritrovato una mia vecchia nota su un testo WCF che citava: “Controllare i servizi Listener Adapters!!!” e in effetti il problema era proprio quello.
image

Morale della favola: Se avete problemi con WAS su protocollo non HTTP, verificate lo stato di questi servizi.smile_teeth

Technorati Tags: ,,

author: Corrado Cavalli | posted @ mercoledì 13 agosto 2008 10.01 | Feedback (2)

Alcune novità di WCF SP1…


  • Il DataContractSerializer è in grado di serializzare tipi che non sono decorati con [DataContract] e [DataMember] in questo caso l’intera interfaccia pubblica del tipo viene serializzata (questo per gli amanti di POCO)
  • E’ possibile pubblicare una WCF Service library usando Publish e decidendo la destinazione (scegliendo IIS ad esempio viene automaticamente generato il relativo .svc)
  • Il WCF Test Client è ora un applicazione che può essere eseguita separatamente, può ospitare più servizi e permette l’editing dei config files.

Ma sopratutto…

image

In una WCF Service library è finalmente possibile decidere se utilizzare WcfSvcHost oppure no clap

Technorati Tags:

author: Corrado Cavalli | posted @ martedì 12 agosto 2008 22.55 | Feedback (0)

WPF Datagrid CTP


Per gli sviluppatori WPF le novità non finisono col SP1: entro fine anno ci sarà un nuovo “rilascio” che conterrà nuovi controlli, tra questi la tanto attesa Datagrid.
Se avete il SP1 installato potete comunque utilizzarla sin da ora usando la versione CTP disponibile qui.

Technorati Tags: ,

author: Corrado Cavalli | posted @ martedì 12 agosto 2008 10.54 | Feedback (0)