Da Flash a Silverlight


Bellissimo articolo dove viene illustrato in nove lezioni come affrontare lo stesso argomento in flash e come in silverlight.

author: Paolo Ongari | posted @ domenica 7 settembre 2008 9.48 | Feedback (1)

.NET Client Profile


Segnalo questo ottimo post su una delle novità dell'SP1 del 3.5

author: Paolo Ongari | posted @ mercoledì 27 agosto 2008 10.25 | Feedback (0)

.NET Reflector sempre a portata di mano


Ho appena scaricato l'ultima versione di .NET Reflector che come già saprete è stato acquistato da Redgate (tranquilli è sempre free cmq).

Una cosa che non sapevo è che ha dei parametri di avvio che consentono anche di integrarlo nel menu contestuale di windows.
Basta lanciare un cmd e poi scrivendo "C:\....\Reflector.exe /register":

ReflectorContext

 

Ecco i parametri:

Usage:
Reflector.exe [options] [assemblies]

Options:
/register - Register file extensions
/unregister - Unregister file extensions
/select:<identifier> - Select item in browser
/fontname:<name> - Use specified font name
/fontsize:<size> - Use specified font size
/configuration:<file> - Use configuration file name
/help - Show this help message

author: Paolo Ongari | posted @ venerdì 22 agosto 2008 18.00 | Feedback (0)

Silverlight tip #4: una classe sprite


Ho appena letto e provato un ottimo esempio e spunto di partenza per creare sprite in silverlight. Ecco il codice che fa uso di caricamento dinamico di codice xaml:

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Markup;
 
namespace SilverlightApplication11
{
    public class Sprite : Control
    {
        private Image _spriteImage;
        private RotateTransform _rotateTransform;
        private int _width;
        private int _height;
        private double _posX = 0;
        private double _posY = 0;
        private double _xInc = 0;
        private double _yInc = 0;
        private int _opacityDir = 1;
 
        private string _spriteTemplate =
          "<ControlTemplate xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"" +
          "                  xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">" +
          "<Image x:Name=\"SpriteImage\">" +
          "   <Image.RenderTransform>" +
          "      <RotateTransform x:Name=\"ImageTransform\">" +
          "      </RotateTransform>" +
          "   </Image.RenderTransform>" +
          "</Image>" +
          "</ControlTemplate>";
 
        public Sprite(int width, int height)
        {
            _width = width;
            _height = height;
 
            Template = (ControlTemplate)XamlReader.Load(_spriteTemplate);
            ApplyTemplate();
        }
 
        public override void OnApplyTemplate()
        {
            _spriteImage = (Image)GetTemplateChild("SpriteImage");
            _rotateTransform = (RotateTransform)GetTemplateChild("ImageTransform");
 
            _rotateTransform.CenterX = _width / 2;
            _rotateTransform.CenterY = _height / 2;
        }
 
        public void SetImage(string resource)
        {
            Uri uri = new Uri(resource, UriKind.Relative);
            ImageSource imgSrc = new System.Windows.Media.Imaging.BitmapImage(uri);
            _spriteImage.Source = imgSrc;
        }
 
 
        public double YInc
        {
            set { _yInc = value; }
        }
        public double XInc
        {
            set { _xInc = value; }
        }
 
        public double PosX
        {
            get { return _posX; }
            set
            {
                _posX = value;
                this.SetValue(Canvas.LeftProperty, _posX);
            }
        }
 
        public double PosY
        {
            get { return _posY; }
            set
            {
                _posY = value;
                this.SetValue(Canvas.TopProperty, _posY);
            }
        }
     
        public bool Step(int speed)
        {
            if (_xInc * speed + _posX > 800 || _xInc * speed + _posX < 0)
                return false;
            if (_yInc * speed + PosY > 600 || _yInc * speed + PosY < 0)
                return false;
 
            PosX += _xInc * speed;
            PosY += _yInc * speed;
 
            if (_opacityDir == 1)
                _spriteImage.Opacity += 0.01;
            else
                _spriteImage.Opacity -= 0.01;
            if (_spriteImage.Opacity >= 1)
                _opacityDir = 0;
            else if (_spriteImage.Opacity <= 0)
                _opacityDir = 1;
 
            return true;
        }
 
        public void Rotate()
        {
            _rotateTransform.Angle += 1;
            _rotateTransform.Transform(new Point(32, 24));
        }
 
    }
}

 

Per animare ad esempio un mio sprite (un pokemon per mio nipotino ad esempio :))

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Markup;
 
namespace SilverlightApplication11
{
    public partial class Page : UserControl
    {
        Sprite _sprite;
 
        public Page()
        {
            InitializeComponent();
 
            this.Loaded += new RoutedEventHandler(Page_Loaded);
            this.KeyDown += new KeyEventHandler(Page_KeyDown);
        }
 
        void Page_Loaded(object sender, RoutedEventArgs e)
        {
            _sprite = new Sprite(50, 50);
            _sprite.SetImage("GOKU.png");
            _sprite.PosX = 350;
            _sprite.PosY = 400;
            MyCanvas.Children.Add(_sprite);
        }
 
        void Page_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key)
            {
                case Key.Up:
                    _sprite.PosY -= 10;
                    break;
                case Key.Down:
                    _sprite.PosY += 10;
                    break;
                case Key.Left:
                    _sprite.PosX -= 10;
                    break;
                case Key.Right:
                    _sprite.PosX += 10;
                    break;
                default:
                    break;
            }
        }
    }
}

 

 

L' esempio completo a questo indirizzo.

author: Paolo Ongari | posted @ giovedì 21 agosto 2008 14.13 | Feedback (0)

Silverlight tip #3: Password textbox


Per rendere la textbox di tipo "password" (nascondendo i caratteri digitati) un semplice modo è quello indicato su questo post utilizzarando un font particolare.

Ecco come fare:

  • scaricare il font allegato e inserirlo nella ClientBin (al pari dello XAP)
  • dichiarare l'utilizzo del font sul controllo in questo modo:
    <TextBox x:Name="txtPwd" FontFamily="password.ttf#Password" />

 

image

 

Lo Xaml:

<UserControl x:Class="SilverlightApplication8.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="400" Height="300">
    <Canvas x:Name="LayoutRoot" Background="White">
        <TextBox x:Name="txtPwd" FontFamily="password.ttf#Password" Width="100" Canvas.Top="10" Canvas.Left="10"/>
        <Button x:Name="btnPwd" Width="100" Canvas.Top="40" Canvas.Left="10" Content="Cosa ho scritto?" Click="btnPwd_Click"/>
        <TextBlock x:Name="lblPwd" Width="100" Canvas.Top="70" Canvas.Left="10"/>
    </Canvas>
</UserControl>

 

Il codice c#

using System.Windows.Controls;
using System.Windows;
 
namespace SilverlightApplication8
{
    public partial class Page : UserControl
    {
        public Page()
        {
            InitializeComponent();
        }
        private void btnPwd_Click(object sender, RoutedEventArgs e)
        {
            lblPwd.Text = txtPwd.Text;
        }
    }
}

author: Paolo Ongari | posted @ sabato 16 agosto 2008 0.54 | Feedback (0)

Silverlight tip #2: Loading images


Ci sono diversi modi per caricare una immagine.... eccone alcuni:

1) includere l'immagine nel progetto, settare nelle proprietà dell'immagine "Build Action" su "Resource" e "Do not copy":

<Image x:Name="imgPic" Source="images/Babba.jpg" />

In questo caso l'immagine sarà embeddata nel nostro assembly.

 

2) stesso esempio ma fatto da codice:

private void OnLoad(object sender, RoutedEventArgs e)
{
    BitmapImage bitmapImage = new BitmapImage();
    Uri uri = new Uri("images/Babba.jpg", UriKind.Relative);
    bitmapImage.UriSource = uri;
    imgPic.Source = bitmapImage;
}

 

3) settare "Build Action" su "Content" e "Do not copy", in questo modo l'immagine sarà embeddata nello XAP:

private void OnLoad(object sender, RoutedEventArgs e)
{
    BitmapImage bitmapImage = new BitmapImage();
    Uri uri = new Uri("/images/Babba.jpg", UriKind.Relative);
    bitmapImage.UriSource = uri;
    imgPic.Source = bitmapImage;
}

 

4) settare "Build Action" su "None" e "Copy always" (o anche "Copy if newer"); in questo caso l'immagine non sarà embeddata ma sarà esterna. Nell'esempio sotto basta copiare l'immagine allo stesso livello dello XAP (nella ClientBin):

private void OnLoad(object sender, RoutedEventArgs e)
{
    BitmapImage bitmapImage = new BitmapImage();
    Uri uri = new Uri("/Babba.jpg", UriKind.Relative);
    bitmapImage.UriSource = uri;
    imgPic.Source = bitmapImage;
}

 

 

5) caricare una immagine dal web specificando il tipo di Uri Assoluto:

private void OnLoad(object sender, RoutedEventArgs e)
{
    BitmapImage bitmapImage = new BitmapImage();
    Uri uri = new Uri("http://www.ongari.it/Images/BabbaOnLine.jpg", UriKind.Absolute);
    bitmapImage.UriSource = uri;
    imgPic.Source = bitmapImage;
}

 

 

6) caricamento tramite WebClient in modo asincrono per file di grosse dimensioni; nell'esempio sotto riportato, posizionare l'immagine nella ClientBin dove si trova lo XAP:

private void OnLoad(object sender, RoutedEventArgs e)
{
    WebClient wc = new WebClient();
    wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
    wc.OpenReadAsync(new Uri("Babba.jpg", UriKind.Relative));
}
void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
    if (e.Error == null)
    {
        StreamResourceInfo streamResourceInfo = new StreamResourceInfo(e.Result as Stream, null);
        BitmapImage bitmapImage = new BitmapImage();
        bitmapImage.SetSource(streamResourceInfo.Stream);
        imgPic.Source = bitmapImage;
    }
}

 

7) caricamento da un file ZIP scaricato tramite WebClient; nell'esempio sotto riportato, posizionare lo ZIP nella ClientBin dove si trova lo XAP:

private void OnLoad(object sender, RoutedEventArgs e)
{
    WebClient wc = new WebClient();
    wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
    wc.OpenReadAsync(new Uri("MioZippone.zip", UriKind.Relative), "Babba.jpg");
}
void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
    if (e.Error == null)
    {
        StreamResourceInfo stream1 = new StreamResourceInfo(e.Result as Stream, null);
        String uri = e.UserState as String;
        StreamResourceInfo stream2 = Application.GetResourceStream(stream1, new Uri(uri, UriKind.Relative));
        BitmapImage bitmapImage = new BitmapImage();
        bitmapImage.SetSource(stream2.Stream);
        imgPic.Source = bitmapImage;
    }
}

 

8) caricamento da percorso locale:

private void OnLoad(object sender, RoutedEventArgs e)
{
    OpenFileDialog d = new OpenFileDialog();
    d.Filter = "Immagini (*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF|Tutti i files (*.*)|*.*";
    if (d.ShowDialog() == true)
    {
        Stream stream = d.SelectedFile.OpenRead();
        BitmapImage bitmapImage = new BitmapImage();
        bitmapImage.SetSource(stream);
        imgPic.Source = bitmapImage;
        stream.Close();
    }
}

author: Paolo Ongari | posted @ venerdì 15 agosto 2008 14.20 | Feedback (0)

Silverlight tip #1: Game Loops


Da oggi inizio a memorizzarmi gli esempi e le prove che faccio con silvelight.

Questo esempio trovato sul blog di Mike Snows consente di creare un loop tramite l'utilizzo dello Storyboard utile da utilizzare nei giochi. Come dice Mike questa tecnica risulta essere la migliore rispetto ad altre.

Nell'esempio vedrete visualizzato un contatore che si incrementa in una TextBlock.
 

Ecco lo XAML:

<UserControl x:Class="SilverlightApplication2.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="400" Height="300">
    <Grid x:Name="LayoutRoot" Background="White">
        <TextBlock x:Name="myTextbox">Display Counter</TextBlock>
    </Grid>
</UserControl>

 

Il codice C#:

using System;
using System.Windows.Controls;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
 
namespace SilverlightApplication2
{
    public partial class Page : UserControl
    {
        Storyboard _gameLoop = new Storyboard();
        int count = 0;
 
        public Page()
        {
            InitializeComponent();
            _gameLoop.Duration = TimeSpan.FromMilliseconds(0);
            _gameLoop.Completed += new EventHandler(MainGameLoop);
            _gameLoop.Begin();
        }
 
        void MainGameLoop(object sender, EventArgs e)
        {
            // Add any game logic/animation here.
            // Example:
            myTextbox.Text = count.ToString();
            count++;
 
            // Continue storyboard timer
            _gameLoop.Begin();
        }
    }
}

 

Per variare il tempo basta incrementare la Duration dello storyboard:

_gameLoop.Duration = TimeSpan.FromMilliseconds(1000); // 1 secondo

 

Ecco il post originale.

author: Paolo Ongari | posted @ venerdì 15 agosto 2008 10.41 | Feedback (0)

VSNET2008 SP1 e Silverlight Tool Beta 2


Per chi come me in questi giorni si sta guardando Silverlight 2.0, se avete installato l'SP1 di Visual Studio 2008 appena uscito, sappiate che dovete aggiornare i Silverlight Tools.

Maggiori informazioni qui.

author: Paolo Ongari | posted @ lunedì 11 agosto 2008 23.03 | Feedback (0)

DeepZoomBabba: Deep Zoom va di moda!


Ormai si vede un pò ovunque, tutti ne parlano, tutti lo provano... allora eccoci qua.

Per chi non lo conoscesse Deep Zoom è una delle 'features' di Silverlight 2.0 che consente di visualizzare immagini ad alta risoluzione in modo 'veloce' scaricando solo la porzione visualizzata.

Per utilizzare questa caratteristica ci viene in aiuto un programmino gratuito che si chiama Deep Zoom Composer veramente facile ed intuitivo da utilizzare.

Le applicazioni che beneficiano dell'utilizzo di questa caratteristica sono diverse: cataloghi, foto vacanze, mosaici, mappe ed indicazioni stradali, anteprime di siti web, ecc...

Quando ho visto l'utilizzo a mosaico più famoso sul web, ovvero "DeepZoomObama" non ho resistito nel provare a fare il "DeepZoomBabba".

image

Farlo è molto semplice grazie al programma gratuiro AndreaMosaic che permette data una immagine di ottenerne il mosaico utilizzando le proprie foto.

... che aspettate a fare il vostro?

 

Ecco un po di link utili:

author: Paolo Ongari | posted @ domenica 10 agosto 2008 1.26 | Feedback (0)

Installare SQL express 2005 con NSIS


Un setup creato con Nullsoft installer che lancia l'installazione di slqexpress solo se non presente.

Ho specificato un po di opzioni che cmq si possono personalizzare (vedi ExecWait ... )

  1. OutFile "SQLExpress2005Setup.exe"
  2.  
  3. Section
  4. SectionEnd
  5.  
  6. Function .onInit
  7.    #installazione non visibile 
  8.    SetSilent silent
  9.   
  10.    # controllo presenza SQL Express 2005
  11.    Call CheckSqlExpress
  12.  
  13.    ExecWait 'SQLEXPR_ITA.EXE /qb INSTANCENAME=SQLEXPRESS \
  14.          ADDLOCAL=SQL_Engine SECURITYMODE=SQL \
  15.          SAPWD=strpwd DISABLENETWORKPROTOCOLS=0'
  16.    SetOutPath "$DESKTOP" 
  17.  
  18.    #Start /wait <CD or DVD Drive>\servers\setup.exe /qb
  19.    #INSTANCENAME=<InstanceName>
  20.    #ADDLOCAL=All
  21.    #PIDKEY=<pidkey value with no "-">
  22.    #SAPWD=<StrongPassword>
  23.    #SQLACCOUNT=<domain\user>
  24.    #SQLPASSWORD=<DomainUserPassword>
  25.    #AGTACCOUNT=<domain\user>
  26.    #AGTPASSWORD=<DomainUserPassword>
  27.    #SQLBROWSERACCOUNT=<domain\user>
  28.    #SQLBROWSERPASSWORD=<DomainUserPassword>
  29. FunctionEnd
  30.  
  31. Function CheckSqlExpress
  32.  
  33.       Call CheckSqlExpressInstalled
  34.         Pop $0
  35.         StrCmp $0 1 found.SQLExpress2005 no.SQLExpress2005
  36.   found.SQLExpress2005:
  37.        MessageBox MB_OK "SQL Express 2005 è già installato."
  38.          abort
  39.   no.SQLExpress2005:
  40. FunctionEnd
  41.  
  42. Function CheckSqlExpressInstalled
  43.  
  44.          Push $0
  45.          Push $1
  46.          Push $2
  47.          Push $3
  48.          Push $4
  49.        Push $5
  50.  
  51.          StrCpy $0 "0"
  52.          StrCpy $1 "SOFTWARE\Microsoft" ;registry entry to look in.
  53.          StrCpy $2 0
  54.  
  55.   StartEnum:
  56.         EnumRegKey $3 HKLM "$1\Microsoft SQL Server" $2
  57.  
  58.         #MessageBox MB_OK "EnumRegKey $3"
  59.         StrCmp $3 "" noSQL notEmpty
  60.  
  61.         ;Trovato qualcosa
  62.     notEmpty:
  63.         ;Inizia per 'MSSQL.'.
  64.         StrCpy $4 $3 6 0
  65.       #MessageBox MB_OK "EnumRegKey $4"
  66.         StrCmp $4 "MSSQL." +1 goNext
  67.      
  68.         ReadRegStr $5 HKLM "$1\Microsoft SQL Server\$3\Setup" "Edition"
  69.       StrCmp $5 "Express Edition" yesSQL goNext
  70.      
  71.       #MessageBox MB_OK "ok: $5"
  72.       Goto noSQL
  73.  
  74.     goNext:
  75.         ;Vado alla prossima chiave.
  76.         IntOp $2 $2 + 1
  77.         goto StartEnum
  78.    
  79.   noSQL:
  80.        #MessageBox MB_OK "NON trovato SQL Express 2005"
  81.        StrCpy $0 0
  82.        Goto done
  83.  
  84.   yesSQL:
  85.        #MessageBox MB_OK "Trovato SQL Express 2005"
  86.        StrCpy $0 1
  87.   done:
  88.       Pop $5
  89.        Pop $4
  90.        Pop $3
  91.        Pop $2
  92.        Pop $1
  93.        ;MessageBox MB_OK $0
  94.        Exch $0
  95.  
  96. FunctionEnd
  97.  

author: Paolo Ongari | posted @ lunedì 7 luglio 2008 9.44 | Feedback (0)

TaskDialog


Interessante dll con sorgenti per evolvere le ns. classiche Messagebox.

Lo trovate a questo indirizzo.

TaskDialog

author: Paolo Ongari | posted @ giovedì 3 luglio 2008 9.32 | Feedback (0)

WMI Code Creator tool


Tool gratuito di Microsoft che ci aiuta con WMI.

Clicca qui per scaricare.

author: Paolo Ongari | posted @ giovedì 26 giugno 2008 12.36 | Feedback (0)