Radical è live la prima alpha di Radical con il supporto per Silverlight 4 e Windows Phone 7.
Che comprende?
più o meno questo:
Ensure
Tutta l’infrastruttura di Ensure presente nella versione “desktop” è adesso disponibile anche per Silverlight e Windows Phone.
Adorner/AdornerLayer
In Wpf gli adorner sono la manna dal cielo per fare una innumerevole quantià di cose, Silveright e Windows Phone 7 non offrono il supporto per gli Adorner, purtroppo… ma dopo un po’ di ************ alla fine abbiamo gli Adorner in Silverlight e Windows Phone 7 e per non farci mancare nulla abbiamo anche gli AdornerLayer. Questo ci permette ad esempio di ottenere questo risultato:
image
Partendo da questo xaml (epurato dei fronzoli inutili all’esempio):
<phoneNavigation:PhoneApplicationPage
    x:Class="Vacuum.Sample.MainPage"
    xmlns:controls="clr-namespace:Topics.Radical.Windows.Controls;assembly=Radical.Windows">    
    <controls:AdornerLayer>
        <Grid Background="{StaticResource PhoneBackgroundBrush}">            
            <Button Click="HyperlinkButton_Click" 
                    Content="Button" 
Margin="235,379,76,340" /> <Image Margin="20,19,0,0" x:Name="image" Stretch="Fill" Source="/Vacuum.Sample;component/Images/MvpPhoto.jpg" HorizontalAlignment="Left" Width="178" Height="196" VerticalAlignment="Top" /> Grid> controls:AdornerLayer> phoneNavigation:PhoneApplicationPage>
L’unica differenza rispetto al solito è che tutto è racchiuso in un AdornerLayer, in realtà non sarebbe necessario ma ho preferito mantenere la simmetria con Wpf.
Anche Wpf ha il concetto di adorner layer che ha lo scopo di raggruppare più adorner e definirne i “limiti” visuali. In Wpf non è necessario inserire manualmente un adorner layer perchè la Window ne contiene sempre almeno uno.

Per ottenere l’effetto di cui sopra non ci resta che definire, in questo esempio da codice, il contenuto del nostro adorner:
public partial class MainPage : PhoneApplicationPage
{
    OverlayAdorner adorner;

    public MainPage()
    {
        InitializeComponent();

        var adornerContent = new Border()
        {
            BorderThickness = new Thickness( 1 ),
            BorderBrush = new SolidColorBrush( Colors.Red ),
            Child = new TextBlock()
            {
                VerticalAlignment = VerticalAlignment.Bottom,
                Foreground = new SolidColorBrush( Colors.Green ),
                Text = "I'm busy right now...",
                FontWeight = FontWeights.Bold,
                RenderTransform = new RotateTransform()
                {
                    Angle = -45
                }
            }
        };

        this.adorner = new OverlayAdorner( this.image, adornerContent );
    }
OverlayAdorner deriva da Adorner e imposta IsHitTestVisible a false in modo da rendere l’adorner trasparente ai click del mouse.
Che cosa abbiamo fatto:

  • In fase di creazione della page creiamo il contenuto dell’adorner:
    • un bordo con del testo ruotato di 45°;
  • creiamo l’istanza dell’adorner passandogli nel costruttore:
    • un riferimento allo UIElement che dovrà “adornare”;
    • un riferimento al contenuto che dovrà essere usato;
Per visualizzare l’adorner non ci resta che appenderlo al visual tree:
private void HyperlinkButton_Click( object sender, RoutedEventArgs e )
{
    var layer = AdornerLayer.GetAdornerLayer( this.image );
    var adorners = layer.GetAdorners( this.image );
    if( adorners.Contains( this.adorner ) )
    {
        layer.Remove( this.adorner );
    }
    else
    {
        layer.Add( this.adorner );
    }
}
utilizzando la stessa tecnica che useremmo con Wpf e quindi passando dall’AdornerLayer.
More2Come :-)
Ci sono altre novità di cui parlerò a breve:
  • Utilities per Model View ViewModel;
  • Multi-threading
  • Memento
Trovate il tutto su CodePlex: http://radical.codeplex.com/releases/view/46757
.m