Events, events, events και λίγα events ακόμη


Πολλά events τον τελευταίο καιρό, τόσο από τη Microsoft Hellas, όσο κι από το community μας. Πριν να κλείσει το έτος, είπα να κάνω έναν απολογισμό. Ξεκινώντας από την αρχή της σεζόν, στα πλαίσια των DevDays της Microsoft Hellas, έχουμε και λέμε:

  • 26 Οκτωβρίου, WPF: From Zero to F5
  • 5 Νοεμβρίου 2009, Silverlight3: See the light!
  • 26 Νοεμβρίου, Make Web Not War

Παάλληλα, το community μας δεν πάει πίσω:

  • 23 Σεπτεμβρίου, 32ο dotNETZone.gr Community Event: Windows Azure – Θεωρία και Πράξη
  • 27 Οκτωβρίου, 33ο dotNETZone.gr Community Event: N-tier RIA applications με κλειστά τα μάτια
  • 19 Νοεμβρίου, 34ο dotNETZone.gr Community Event: Why & How to optimize SQL Server for performance from design to query

Και ας μην ξεχάσουμε το 1ο Architecture Days event στις 22 Οκτωβρίου: Reconnecting Computers with Business με τους πολύ σημαντικούς ομιλητές που σημείωσε μεγάλη επιτυχία.

Πλέον, πριν να φτάσουμε στα Χριστούγεννα, έχουμε το μεγάλο event Join The New Efficiency στο Μέγαρο Μουσικής για την παρουσίαση Windows 7, Windows Server 2008 R2, Microsoft Exchange Server 2010 & Windows Phone

Επίσης τα DevDays συνεχίζουν στις 17 Δεκεμβρίου 2009 με θέμα HardCore! The Wild Side of .NET

Καθώς τόσο στα δικά μας events, όσο και σε αυτά της Microsoft Hellas, έχουμε συμμετάσχει κι εμείς, εύχομαι καλό κουράγιο και καλή συνέχεια για το 2010.


WPF resources από τα WPF events


Με τη σημερινή Post-launch ημερίδα ολοκληρώθηκε η σειρά από events σχετικά με το WPF, οπότε είπα και να μαζέψω σε ένα post όλο το σχετικό υλικό.

Αρχικά έχουμε το WPFPresenter, το power-point-like application μέσω του οποίου έδειξα τα βασικά περί WPF. Όπως σας ανέφερα, βασίζεται στο πρωτότυπο της Beatriz Costa, guru του WPF Data Binding. Μέσα από το blog της μπορείτε τα μάθετε τα πάντα περί Data Binding.

Επίσης, είπαμε για το white-paper που περιγράφει το «New Iteration» concept, τη συνεργασία μεταξύ developer και designer καθώς και τον ρόλο του integrator. Θα το βρείτε εδώ.

Το logon demo που έδειξα, προέρχεται από το Visual Studio 2008 and .NET Framework 3.5 Training Kit Μέσα στο kit θα βρείτε σπουδαίο υλικό για όλες τις τεχνολογίες του .ΝΕΤ Framework 3.5 όπως hands on labs, demos και παρουσιάσεις.

Κάτι άλλο που συζητήσαμε, ήταν αυτό το απίθανο παράδειγμα ιατρικής εφαρμογής που δείχνει πώς το WPF (υπό τη μορφή του Silverlight) μπορεί να χρησιμοποιηθεί για να υλοποιηθούν εφαρμογές που μέχρι σήμερα θα ήταν αδύνατον ή θα απαιτούσαν πολύ κώδικα για πράγματα που στο WPF είναι εκ των ων ουκ άνευ. Α! Μην ξεχάσετε να δείτε και αυτό το υποδειγματικό UI design από μια εφαρμογή που ακούει στο όνομα «Lawson Smart Client«. Την είδατε; Ωραία, βάλτε αγγελία τώρα για designer.

Τώρα, στο 18ο dotNETZone.gr Community Event (WPF: Developing business applications) έδειξα ένα demo το οποίο μπορείτε να βρείτε εδώ. Στην κουβέντα περί unit testing στο WPF ανέφερα το WPF Application Quality Guide, έναν οδηγό που περιέχει ανεκτίμητο υλικό σχετικά με testing των WPF εφαρμογών. Ενδεικτικά στα περιεχόμενα βρίσκουμε: Τest methodologies,visual verification testing, media testing, performance best practices καθώς και μια λίστα από utilities που αφορούν στο debugging και στο testing των WPF εφαρμογών.

Τέλος, δεν μπορώ να μην αναφέρω ότι τεράστια βοήθεια βρήκα (και βρίσκω συνεχώς) στο blog του Josh Smith αλλά και στα άρθρα του στο CodeProject.com. Ειδικά στο άρθρο περί MVC, βασίζεται το τελευταίο demo που έδειξα στο event. Ο Josh Smith είναι ένας από τους δημιουργούς του Mole, ενός visualizer για το Visual Studio που κάνει το debugging απείρως ευκολότερο. Απλά, δε νοείται debugging στο WPF χωρίς το Mole.

Ελπίζω να μην ξέχασα τίποτα από αυτά που είχα υποσχεθεί να σας δώσω. Αν υπάρχει κάτι, μου αφήνετε μήνυμα.


Silverlight case study: Renault Laguna Coupé


Σήμερα έπεσε στην αντίληψή μου το site που έχει στήσει η Renault για το νέο Ranault Laguna Coupe. Βασίζεται στο Silverlight και μπορείτε να δείτε το DeepZoom εν δράσει (στην επιλογή «Full Imersion») καθώς και τη χρήση video. Πολύ όμορφο… Μαζί με το Hard Rock Memorabilia και το Patient Journey Demonstrator, αποτελούν αντιπροσωπευτικά δείγματα της τεχνολογίας. Άντε να δούμε και το site των Ολυμπιακών αγώνων του Πεκίνου, με όλα τα απίθανα κόλπα περί video που έχουν ανακοινωθεί!

Κοιτάζοντας λοιπόν το site, πήγα στο Full Imersion και επέλεξα από κάτω το «Tag». Περίμενα ότι θα έβλεπα τα κλασικά tag clouds ωστόσο με αιφνιδίασε ευχάριστα το visualization που τοποθετεί τα tags σε τρισδιάστατο χώρο και αλληλεπιδρούν με το ποντίκι. Το tag cloud μοίαζει με πραγματικό cloud! Ουσιαστικά αυτό είναι όλο το θέμα: Ναι, μπορείς να κάνεις τη δουλειά σου με τις γκρι φόρμες και τα κλασικά grids, comboboxes και listboxes ωστόσο όταν υπάρχει intuitive visualization τότε ο χρήστης «αισθάνεται» καλύτερα την εφαρμογή με όλα τα συνεπακόλουθα. Όπως σίγουρα «μπορείς να κάνεις τη δουλειά σου» και με μία DOS εμπορολογιστική εφαρμογή. Στα δύο Post-Launch Events που παρουσίασα το WPF δέχθηκα και τις δύο φορές την ερώτηση «γιατί να πάω στο WPF;». Το θέμα του visualization είναι μια από τις πιο σημαντικές αιτίες. Αυτό σημαίνει όμως ότι αν τελικά αποφασίσει κάποιος να πάει στο WPF θα πρέπει να έχει το WPF mentality και να είναι πρόθυμος να φτιάξει το ανάλογο UI. Ερχόμαστε δηλαδή στην αρχή μιας νέας εποχής, όπως τότε που περάσαμε από τις DOS εφαρμογές στις Windows εφαρμογές. Μπορεί όχι τόσο ως προς το τεχνικό κομμάτι αλλά ως προς το UI κομμάτι.


Δωρεάν WPF kickstart εκπαίδευση


Χθες παρατήρησα ότι αυτόν τον καιρό υπάρχουν αρκετά events για το WPF. Αν κάποιος τα παρακολουθήσει θα μπορεί να πάρει μια πάρα πολύ καλή ιδέα για το αντικείμενο και θα μπει σε καλό δρόμο για να το ψάξει παραπάνω με τη βοήθεια ενός βιβλίου ή με on-line resources. Έχουμε και λέμε:

29 Μαΐου: Microsoft Hellas Event: 2008 Post Launch Event

Στο τρίτο session, θα παρουσιάσω τα εισαγωγικά περί WPF και θα δείξω τη συνεργασία Developer – Designer μέσω του Expression Blend. Το event αυτό γέμισε λίγες ώρες μετά την ανακοίνωσή του! Όποιος δεν πρόλαβε, ας έχει το νού του γιατί θα βγει ανακοίνωση για επαναληπτικό στις 5 Ιουνίου.

31 Μαΐου: 9o StudentGuru event: Hands-on WPF

Πρόκειται για ένα τρίωρο hands-on lab που θα τρέξουν τα παιδιά του StudentGuru. 3D ακούω, Blend ακούω, data binding ακούω… Προβλέπεται ενδιαφέρον!

3 Ιουνίου: 18ο dotNETZone.gr Community Event – WPF: Developing business applications

Σε αυτό το event θα παρουσιάσω τα χαρακτηριστικά του WPF που σχετίζονται με τη δημιουργία business εφαρμογών, καθώς αλλάζουν αρκετά πράγματα σε σχέση με τον τυπικό τρόπο που γράφουμε desktop ή web εφαρμογές.


Dynamic XAML: Ευκολότερα δεν γίνεται!


Το Windows Presentation Foundation ως markup μηχανισμός μας δίνει νέες δυνατότητες στη δημιουργία rich client εφαρμογών με στοιχεία που μέχρι σήμερα είχαμε διαθέσιμα μόνο στις ASP.NET εφαρμογές. Ένα κλασικό θέμα είναι η δημιουργία του UI on-the-fly, κατά το runtime, βάσει meta-data που μπορεί να έρχονται από οποιαδήποτε πηγή. Ήδη μου έλεγε ο Παναγιώτης Καναβός τις προάλλες για το ASP.NET Dynamic Data Support που επιτρέπει τη δημιουργία data-driven web εφαρμογών μέσω templates χωρίς να χρειάζεται να γίνει βάλει χέρι ο προγραμματιστής. Κατόπιν, σκέφτηκα κάλλιστα αυτά τα templates θα μπορούσαν να είναι σε XAML οπότε τελικά να καταλήγει κανείς σε WPF αντί ASP.NET εφαρμογή. Μάλιστα, παίζοντας τις προάλλες με το Linq To XML και τα XML Literals της VB, είπα να σκαρώσω κάτι ανάλογο. Έχουμε και λέμε λοιπόν:

Ξεκινάμε με ένα XAML window που έχει ένα button και ένα frame:

<Window x:Class="Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <Button Height="23" Name="Button1" HorizontalAlignment="Left" 
Margin="10,10,0,0" VerticalAlignment="Top" Width="75">
Button</Button> <Frame Margin="10,50,12,12" Name="Frame1" /> </Grid> </Window>

Κατόπιν, ορίζουμε μία κλάση που θα περιέχει τα meta-data

    Public Class Field
        Private _Name As String
        Public Property Name() As String
            Get
                Return _Name
            End Get
            Set(ByVal value As String)
                _Name = value
            End Set
        End Property


        Private _Description As String
        Public Property Description() As String
            Get
                Return _Description
            End Get
            Set(ByVal value As String)
                _Description = value
            End Set
        End Property
    End Class

Στη συνέχεια, στο click event του button κάνουμε τα εξής: Γεμίζουμε ένα List(Of T) με τα data. Στη συγκεκριμένη περίπτωση με χαζό τρόπο αφού τώρα δεν είναι αυτό το ζητούμενο:

Dim Fields As New List(Of Field)(New Field() _
       { _
          New Field With {.Name = "LastName", _
                          .Description = "Last Name"}, _
          New Field With {.Name = "FirstName", _
                          .Description = "First Name"}, _
          New Field With {.Name = "Salary", _
                          .Description = "Salary"} _
       })

 

Και τώρα έρχεται το μαγικό! Στο click event του Button1 αρχικά θα φτιάξουμε το template μας:

Dim GeneratedXAML As XElement = _
 <StackPanel Margin="0,46,0,0" Name="StackPanel2">
     <%= From Field In Fields Select _
         <DockPanel>
             <Label Width="100"><%= Field.Description %></Label>
             <TextBox Name=<%= Field.Name & "TextBox" %>></TextBox>
         </DockPanel> %>
 </StackPanel>

Ουσιαστικά, θα τρέξει το Linq to XML query και θα παραχθεί το παρακάτω:

<StackPanel Margin="0,46,0,0" Name="StackPanel2">
 <DockPanel>
     <Label Width="100">Last Name</Label>
     <TextBox Name="LastName"></TextBox>
 </DockPanel>
 <DockPanel>
     <Label Width="100">First Name</Label>
     <TextBox Name="FirstName"></TextBox>
 </DockPanel>
 <DockPanel>
     <Label Width="100">Salary</Label>
     <TextBox Name="Salary"></TextBox>
 </DockPanel>
</StackPanel>

Οπότε μένει να δούμε πως θα το περάσουμε κατά το runtime μέσα στο Frame. Θα χρησιμοποιήσουμε το property Content στο οποίο θα κάνουμε assign ένα νέο StackPanel που θα προέλθει από το XElement. Εδώ θα μας βοηθήσει η κλάση XamlReader η οποία επιτρέπει τον μετασχηματισμό XAML markup σε object. Ας τα δούμε όλα μαζί:

Dim parser As New ParserContext()
parser.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation")
parser.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml")

Dim stream As MemoryStream = New MemoryStream(System.Text.Encoding.UTF8.GetBytes(GeneratedXAML.ToString))
Dim newPanel As StackPanel = CType(XamlReader.Load(stream, parser), StackPanel)
Frame1.Content = newPanel

Ουσιαστικά, όλη η δουλειά γίνεται με τις δύο τελευταίες γραμμές κώδικα. Όλα τα προηγούμενα μπορούμε να τα παραλείψουμε και να μην χρησιμοποιήσουμε το MemoryStrean καθώς και το ParserContext, απλά γράφοντας

Dim newPanel As StackPanel = CType(XamlReader.Load(GeneratedXAML.CreateReader), StackPanel) 
Frame1.Content = newPanel

όμως τότε θα πρέπει να βάλουμε τα namespaces μέσα στο XML literal σε διάφορα σημεία, πράγμα που κάνει τον κώδικα λιγότερο ευανάγνωστο.

Πατάμε το κουμπάκι λοιπόν και από

Before

έχουμε

after

 

Happy Coding!


Ξέρεις Windows Forms; Μάθε WPF


Βρήκα σε αυτή (http://blogs.msdn.com/jfoscoding/attachment/765135.ashx) τη διεύθυσνη ένα πολύ ενδιαφέρον Word doc το οποίο παρουσιάζει το WPF και απευθύνεται σε WinForm developers. Αρκετό υλικό και μπόλικα links στο πνεύμα του "στα Windows Forms έχουμε αυτό, στο WPF πως γίνεται;"

Enjoy!