o-LIVE-r

Windows, Windows Phone, Silverlight, Internet Explorer, and the Cloud

  • o-LIVE-r

    Silverlight 2 – Deep Zooms automatisch generieren

    • 0 Comments

    Der Deep Zoom Composer ist ein extrem cooles Werkzeug, wenn es darum geht hochauflösende und viele Bilder leicht und schnell darzustellen. Er erzeugt direkt eine fertige Silverlight-Anwendung inklusive Visual Studio Projekt.

    Allerdings ist er nicht dazu geeignet Bilder automatisiert für Deep Zoom vorzubereiten. Aber selbst dafür liefert der Deep Zoom Composer die Lösung direkt mit. Und zwar befindet sich die gesamte Logik für die Deep Zoom Bilder Erstellung in der dll DeepZoomTools.dll. Diese wird mit dem Deep Zoom Composer automatisch mit ausgeliefert.

    image

    Bindet man diese DLL in sein Visual Studio Projekt ein, kann man die gesamte Automatisierung selber schreiben.

    image

    Um nun Bilder aus einem Verzeichnis inklusive Unterverzeichnisse automatisch in ein Deep Zoom Verzeichnis zu konvertieren sind nur wenige Zeilen Code notwendig.

    using System.Collections.Generic;
    using System.IO;
    using Microsoft.DeepZoomTools;
     
    namespace DeepZoomLogic
    {
        public class DeepZoomHelper
        {
            public DeepZoomHelper(string sourceFolder, string destinationFolder)
            {
                _sourceFolder = sourceFolder;
                _destinationFolder = destinationFolder + "\\";
            }
     
            private string _sourceFolder;
            private string _destinationFolder;
     
            public void Start()
            {
                List<string> images = GetImagesInDirectory(_sourceFolder);
                List<string> data = new List<string>();
     
                foreach (var image in images)
                {
                    ImageCreator ic = new ImageCreator();
     
                    ic.TileSize = 256;
                    ic.TileFormat = ImageFormat.Jpg;
                    ic.ImageQuality = 0.95;
                    ic.TileOverlap = 0;
     
                    string target = _destinationFolder + "\\output_images\\" + Path.GetFileNameWithoutExtension(image);
     
                    ic.Create(image, target);
                    data.Add(Path.ChangeExtension(target, ".xml"));
                }
     
                CollectionCreator cc = new CollectionCreator();
     
                cc.TileSize = 256;
                cc.TileFormat = ImageFormat.Jpg;
                cc.MaxLevel = 8;
                cc.ImageQuality = 0.95;
     
                cc.Create(data, _destinationFolder + "\\output");
            }
     
            private static List<string> GetImagesInDirectory(string path)
            {
                return GetImagesInDirectory(new DirectoryInfo(path));
            }
     
            private static List<string> GetImagesInDirectory(DirectoryInfo di)
            {
                List<string> images = new List<string>();
     
                foreach (var fi in di.GetFiles("*.jpg"))
                {
                    images.Add(fi.FullName);
                }
     
                foreach (var sub in di.GetDirectories())
                {
                    images.AddRange(GetImagesInDirectory(sub));
                }
     
                return images;
            }
     
        }
    }
     
     

    Verbindet man das ganze noch mit einer kleinen Upload-Vorrichtung, hat man sein eigenes Fotoportal schon fast fertig.

    Das ganze habe ich als kleine Sample-Anwendung zum Download bereit gestellt. Link siehe unten.

    Schritt 1: Bilder hochladen

    image

    Schritt 2: Erstellen des Deep Zooms mittels der oben genannten Klasse

    Schritt 3: Tada …

    image

    Download des Projektes

  • o-LIVE-r

    Datenbank-Anwendungen mit Silverlight

    • 0 Comments

    Vor einigen Tagen habe ich einen Webcast zum Thema “Datenbankfrontends mit Silverlight 2” erstellt. Der Webcast ist inzwischen hier zu finden: http://mymsdn.de/webcasts

    Der Sourcecode für den Webcast gibt es hier:

  • o-LIVE-r

    Onlineshop in Silverlight 2 – www.eastberlinshop.com

    • 0 Comments

    Das Webunternehmen Weltretter insbesondere Christoph Schuster (www.weltretter.com) hat vor einigen Tagen einen Onlineshop für das Modelabel Eastberlin fertig- und onlinegestellt.

    image

    Die Website basiert zu 100% auf Silverlight 2.

    Die Website von Eastberlin ist hier zu finden: www.eastberlinshop.com

  • o-LIVE-r

    Comics mit Silverlight 2 selber erstellen

    • 0 Comments

    Unter den MSDN Webcast (www.my-msdn.de/webcasts) findet sich nun ein neuer Silverlight 2-Tipps und Tricks Webcast zum Thema: Comics mit Silverlight erstellen.

    Dazu habe ich in wenigen Stunden einen kleinen Comic-Strip aus der Sicht eines Entwicklers geschrieben:

    • Controls für immer wiederverwendete Elemente im Comic
    • Eigenschaften an Controls bzw. Charakteren zum Steuern (z.B. Augen)

    image

    Die Charaktere habe ich dabei mit einem einfachen Trick erstellt. Ich habe ein JPG als Vorlage genommen und mit Expression Design die Konturen einfach mit Vektortools nachgezeichnet, hat überraschend wenig Zeit gekostet.

    Den gesamten Source kann man sich unter dem folgenden Link anschauen:

    Das Projekt live erleben, kann man auf meiner Homepage unter:
    http://www.the-oliver.com/project/comic/

    image

  • o-LIVE-r

    Service Pack 2 für Windows Vista und Windows Server 2008 verfügbar

    • 0 Comments

    Das zweite Service Pack für Windows Vista und Windows Server 2008 (RTM Version = released to manufacturing) enthält neben neuen Verbesserungen und Korrekturen ebenfalls alle Updates, die seit Service Pack 1 veröffentlicht wurden, sowie Unterstützung für neue Hardware und Hardwarestandards. Das Updatepaket wurde für beide Betriebssysteme zusammengefasst, um Bereitstellung und Support zu vereinfachen. Eine kurze Übersicht über die Änderungen in SP2 finden Sie im Dokument zu den wesentlichen Änderungen. Im MSDN Windows Developer Center finden Sie auch weiterführende Informationen.
    MSDN Subscription-Download: Windows Vista Service Pack 2

  • o-LIVE-r

    Silverlight-Spiel Dr. Dobbs’s Challenge Deuce

    • 0 Comments

    Spielen, erweitern, selbst entwickeln …und Preise im Wert von bis zu 10.000$ gewinnen! (+ TeamConf09)

    Dr. Dobbs’s Challenge Deuce ist ein klassischer Plattformer im 8-Bit-Style. Dr. Dobbs und seine Freunde hüpfen und hangeln sich durch eine Vielzahl Level und sammeln Visual Studio Power-Ups – und als wäre das noch nicht genug Spaß: Jeder kann das Spiel erweitern und alleine oder mit gemeinsam mit Freunden neue Level gestalten und dabei Preise im Wert von bis zu 10.000$ gewinnen (da der Dollar mittlerweile ja leider wieder etwas wert ist, ist das eine ganze Menge).

    clip_image002

    Mittels der Option „Create“ kann jeder auch ohne Programmierkenntnisse direkt innerhalb des Spiels neue Level gestalten und nimmt damit automatisch an der wöchentlichen Verlosung für den besten Level teil. Verlost werden Dr. Dobbs “Wackeldackel-Puppen” und wöchentlich 500$.

    Wer stattdessen beweisen will dass er (oder sie) auch über „mad coding skills“ verfügt kann die Silverlight-Anwendung inklusive SDK usw. herunterladen und ein eigenes Spiel auf Basis des Quellcodes entwickeln. So richtig „mad“ müssen die Programmierkenntnisse übrigens gar nicht sein, denn Tutorials und ausführliche Einführungen sind ebenfalls verfügbar. Damit fällt auch Einsteigern mit sehr geringen Programmierkenntnissen das Entwickeln eines eigenen Silverlight-Spiels leicht.

    Interessiert? Dann nix wie hin: http://dobbschallenge2.com

    Und da wir schon beim Thema Visual Studio Power-Ups sind: Vom 5.-7. Mai findet in München die TeamConf statt – die Konferenz zum Thema Visual Studio Team System in der Praxis, veranstaltet in Kooperation mit iX aus dem Heise Zeitschriften Verlag.

    Ziel der Konferenz ist es, den Teilnehmern eine breite Kommunikationsplattform rund um das Thema Microsoft Visual Studio Team System und dem Team Foundation Server zu bieten. Hierzu werden in Anwenderberichten renommierte Unternehmen über ihre bisher mit Microsoft Visual Studio Team Systems gesammelten Erfahrungen berichten. In Fachvorträgen werden sowohl lösungsorientierte Szenarien und Best Practices mit Visual Studio Team System vorgestellt als auch Methodiken des modernen Software Engineerings beleuchtet. Zusätzlich wird in Technologiebeiträgen auf die technischen Details einzelner Funktionsbereiche von Visual Studio Team System eingegangen.
    Absolute Highlights der Konferenz sind die Keynotes von Ken Schwaber (Erfinder von SCRUM) und Cameron Skinner (Product Unit Manager im Visual Studio Team System (VSTS)-Team).

    Ausführliche Informationen zur TeamConf 2009 erhalten Sie hier: www.teamconf.de

    Wer dabei noch sparen möchte, kann sich bei meinem Kollegen Christian Binder melden, er kann noch den Code für den Frühbucher-Rabatt besorgen, mit dem sich bis zu 200,- Euro sparen lassen.

  • o-LIVE-r

    Silverlight 3-Tip 1: Out of Browser-Anwendungen

    • 0 Comments

    In Silverlight 3 ist es nun möglich Browser-Anwendungen auch außerhalb des Browsers zu starten. Dazu sind nur ganz wenige Schritte notwendig.

    Schritt 1: Aktivieren der Out-of-Browser-Funktionalität im Manifest (AppManifest.xml)

    <Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <Deployment.Parts>
        </Deployment.Parts>
     
        <Deployment.ApplicationIdentity>
            <ApplicationIdentity 
                ShortName="Olivers Silverlight 3 Demos" 
                Title="Olivers Silverlight 3 Demos">
                <ApplicationIdentity.Blurb>Silverlight 3 Demos</ApplicationIdentity.Blurb>
            </ApplicationIdentity>
        </Deployment.ApplicationIdentity>
        
    </Deployment>

    Schritt 2 a: Installieren via Code

    void _demo1Button_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        Application.Current.Detach();
    }

    Wichtige Vorbedingung: Es ist nicht möglich die Anwendung automatisch zu installieren Es ist nur möglich in einem Event, das von einem Benutzer ausgeführt wurde diesen Code einzufügen.

    Schritt 2 b: Installieren via Kontext-Menü

    image

    Deinstallieren via Kontext-Menü …

    image

    Überprüfen ob man sich derzeit im Out-Of-Browser-Modus befindet geht ebenfalls sehr einfach.

    Application.Current.ExecutionState

    Gibt diese Methode den Wert True zurück, so bedeutet dies das die Anwendung nicht im Browser gestartet wurde, sondern vom sogenannten “Detach Mode”.

    Application.Current.RunningOffline

    Gibt dieser Wert "True” zurück, dann existiert derzeit keine Internetverbindung.

  • o-LIVE-r

    Carousel-Control in Silverlight 2

    • 0 Comments

    Nichts leichter als das.

    image

    Da ich inzwischen einige Controls erstellt habe, arbeite ich ganz gerne mit Vererbung und meine Basisklasse für das Carousel ist der BaseContainer:

       1: using System.Windows.Controls;
       2: using System.Windows;
       3:  
       4: namespace Oliver.Controls
       5: {
       6:     public partial class BaseContainer : Panel
       7:     {
       8:         #region ItemWidth
       9:  
      10:         public double ItemWidth
      11:         {
      12:             get { return (double)GetValue(ItemWidthProperty); }
      13:             set { SetValue(ItemWidthProperty, value); }
      14:         }
      15:  
      16:         public static readonly DependencyProperty ItemWidthProperty =
      17:             DependencyProperty.Register("ItemWidth", typeof(double), typeof(BaseContainer), 
      18:             new PropertyMetadata(100.0, OnItemWidthChanged));
      19:  
      20:         private static void OnItemWidthChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
      21:         {
      22:             BaseContainer baseContainer = d as BaseContainer;
      23:             baseContainer.InvalidateArrange();
      24:         }
      25:  
      26:         #endregion 
      27:  
      28:         #region ItemHeight
      29:  
      30:         public double ItemHeight
      31:         {
      32:             get { return (double)GetValue(ItemHeightProperty); }
      33:             set { SetValue(ItemHeightProperty, value); }
      34:         }
      35:  
      36:         public static readonly DependencyProperty ItemHeightProperty =
      37:             DependencyProperty.Register("ItemHeight", typeof(double), typeof(BaseContainer),
      38:             new PropertyMetadata(100.0, OnItemHeightChanged));
      39:  
      40:         private static void OnItemHeightChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
      41:         {
      42:             BaseContainer baseContainer = d as BaseContainer;
      43:             baseContainer.InvalidateArrange();
      44:         }
      45:  
      46:         #endregion
      47:  
      48:         
      49:     }
      50: }

    Die Datei BaseContainer.cs

    Sie enthält zwei Eigenschaften “ItemWidth” und “ItemHeight” die ich in allen Container-Controls immer wieder benötigte, daher kommen diese in die “Masterklasse”.

    In Wirklichkeit ist dies eine WPF-Klasse die ich in meinen Silverlight-Controls ebenfalls verwende und als Referenz einbinde. Für gewisse Effekte benötige ich dann auch noch immer wieder gerne die aktuelle Framerate des Plug-Ins. Diese Funktion kann allerdings WPF nicht auf meine gewünschte Art und Weise. Deshalb erweitere ich die BaseContainer-Klasse mittels Partial Class um ein Feature:

       1: using System;
       2: using System.Windows;
       3: using System.Windows.Controls;
       4:  
       5: namespace Oliver.Controls
       6: {
       7:     public partial class BaseContainer : Panel
       8:     {
       9:         public TimeSpan FrameRate
      10:         {
      11:             get 
      12:             {
      13:                 return GetFrameRate();
      14:             }
      15:         }
      16:  
      17:         public static int FramesPerSecond
      18:         {
      19:             get { return 1000 / Application.Current.Host.Settings.MaxFrameRate; }
      20:         }
      21:  
      22:         public static TimeSpan GetFrameRate()
      23:         {
      24:             int ms = FramesPerSecond;
      25:             return TimeSpan.FromMilliseconds(ms); 
      26:         }
      27:     }
      28: }

    Die Datei BaseContainer.Silverlight.cs

    Das eigentliche Logik für das Carousel kommt in die Carousel.cs-Datei.

    Dabei sind zwei Methoden besonders wichtig: MeasureOverride und ArrangeOverride

    MeasureOverride –> Diese sagt jedem Element im Panel, das sich die “Kinder” des Elements an die neue Größe anzupassen haben …

       1: protected override Size MeasureOverride(Size availableSize)
       2: {
       3:     foreach (UIElement element in Children)
       4:     {
       5:         element.Measure(new Size(ItemWidth, ItemHeight));
       6:     }
       7:     return availableSize;
       8: }

    ArrangeOverride –> Ordnet die Elemente im Panel neu an. In unserem Fall, wird der Winkel der Elemente berechnet, an dem die einzelnen Elemente stehen.

       1: protected override Size ArrangeOverride(System.Windows.Size finalSize)
       2: {
       3:     for (int i = 0; i < Children.Count; i++)
       4:     {
       5:         // Calculate and set angle of all children
       6:         double angle = i * (Math.PI * 2) / Children.Count;
       7:         Children[i].SetValue(CarouselPanel.AngleProperty, angle);
       8:     }
       9:     DoArrange();
      10:  
      11:     return base.ArrangeOverride(finalSize);
      12: }

    Die Methode DoArrange() sorgt dafür das sich das ganze auch noch drehen kann.

       1: void DoArrange()
       2: {
       3:     double height = this.DesiredSize.Height;
       4:     double width = this.DesiredSize.Width;
       5:  
       6:     Point center = new Point((width - ItemWidth) / 2, (height - ItemHeight) / 2);
       7:     double radiusX = center.X;
       8:     double radiusY = center.Y; 
       9:     double scale = ScalePerspective; 
      10:  
      11:     for (int i = 0; i < Children.Count; i++)
      12:     {
      13:         UIElement item = Children[i];
      14:  
      15:         double current = (double)item.GetValue(CarouselPanel.AngleProperty);
      16:         double angle = current + (_internalSpeed * (3 / 360.0) * (2 * Math.PI));
      17:         item.SetValue(CarouselPanel.AngleProperty, angle);
      18:         double radians = angle;
      19:  
      20:         Point p = new Point(
      21:             (Math.Cos(radians) * radiusX) + center.X,
      22:             (Math.Sin(radians) * radiusY) + center.Y);
      23:     
      24:         if (item.RenderTransform == null || 
      25:             (!(item.RenderTransform is ScaleTransform)))
      26:         {
      27:             item.RenderTransform = new ScaleTransform();
      28:         }
      29:         
      30:         ScaleTransform sc = item.RenderTransform as ScaleTransform;
      31:  
      32:         double scaleMinusRounding  = p.Y / (center.Y + radiusY); 
      33:         sc.ScaleX = sc.ScaleY =  Math.Min(scaleMinusRounding + scale, 1.0) ; 
      34:  
      35:         int zIndex = (int) ((p.Y / this.Height) * 50);                   
      36:         item.SetValue(Canvas.ZIndexProperty, zIndex);
      37:  
      38:         Rect r = new Rect(p.X, p.Y, ItemWidth, ItemHeight);
      39:         item.Arrange(r);
      40:         item.InvalidateArrange();
      41:      }
      42: }

    Den vollständigen Code kann man unter www.the-oliver.com herunterladen.

    Das Ergebnis sieht wie folgt aus:

    Get Microsoft Silverlight
  • o-LIVE-r

    Im Handumdrehen zur passenden Software mit den Microsoft Subscriptions

    • 0 Comments

    Immer die aktuellsten Entwicklungs- und Designwerkzeuge zur Hand, das gesamte Microsoft-Portfolio zum unbegrenzten Testen beziehungsweise Evaluieren, immer auf dem neuesten Stand und kostenloser Profisupport. Lebenslange Lizenzen, verteilte Zahlungen und bessere Kosten-Planbarkeit.

    Gute Gründe, die gerade in der aktuellen Krise dafür sprechen, Software via Abonnement/Subscription zu lizenzieren anstatt teuer einzelne Boxen zu kaufen. Aber welche der drei Subscriptions ist ideal für Sie? Microsoft bietet maßgeschneiderte Lösungen für Designer/Webentwickler, klassische Softwareentwickler und für IT-Profis an. Mit einem neuen kurzen Test finden Sie anhand weniger Fragen heraus, welche für Ihren Arbeitsalltag und Ihre Firmenstruktur optimal ist:

    • Expression Professional Subscription: Das „Rundum-Sorglos-Softwareabo“ für Webdesigner, Webentwickler und Entwickler von Rich Internet Applications mit den neuesten Tools für WPF und Silverlight.
    • MSDN Subscriptions: Die optimale Ergänzung zu Visual Studio: für das professionelle Entwerfen, Entwickeln und Testen aller Arten von IT-Anwendungen.
    • TechNet Plus Abonnement: Die unverzichtbare Ressource für IT-Experten, um Probleme zu lösen, die Systemsicherheit zu optimieren und Deployments vorzubereiten.

    clip_image002

    Klicken Sie hier, um herauszufinden welches Modell Ihnen am besten dabei helfen kann, Ihre Kosten deutlich zu senken und Ihre Designer, Entwickler und Administratoren optimal auszustatten: http://www.microsoft.com/germany/aktionen/subscriptions/

  • o-LIVE-r

    Silverlight 3 Demos und Trainingskit

    • 0 Comments

    Zu meinen Aufgaben als Developer Evangelist gehört auch das Erstellen von Demos (meistens vor Publikum) oder erstellen von Beispiel-Code. Das ist prinzipiell sehr einfach. Allerdings ist das Bereitstellen oftmals etwas komplizierter als man denkt, und aber auch die Wartung von Aktualisierungen dieses Codes.

    Daher habe ich mir jetzt im Rahmen der Silverlight 3 Beta, ein sogenanntes Demo und Trainingskit ausgedacht, das sich jeder lokal (out of browser) aber auch Online direkt live angucken und downloaden kann. Dort werde ich nach und nach immer mehr meiner Demos inkl. Sourcecode bereitstellen.

    Das ganze befindet sich noch im Aufbau, daher bin ich sehr an Feedback interessiert, wie man die Darstellung und die Inhalte verbessern könnte.

    Das Demokit befindet sich hier: http://www.the-oliver.com/sl3Training/

    image

    Wichtig: Es wird Silverlight 3 Beta 1 benötigt um sich die Seite anzusehen.

  • o-LIVE-r

    Silverlight 2 – Minigame

    • 0 Comments

    Diese Woche wird ein weiterer Webcast zum Thema Spieleentwicklung mit Silverlight bei www.my-msdn.com/webcasts veröffentlicht.

    Dazu habe ich mein Lieblingsspiel im Windows Mobile Spiele-Sortiment als Vorlage verwendet und es auf Silverlight nach implementiert. Dauer zwei Stunden, meine Freundin ist leidtragende Zeugin :-)

    image

    Die Live Version für Silverlight 2 kann man hier finden:
    http://www.the-oliver.com/demos/sl2/bubblesgame/

    Den gesamten Code kann hier herunterladen.

    Das ganze ist recht simple gehalten, darf aber sehr gerne hergenommen werden und um neue Features erweitert werden … Einzige Bedingung … ich will es auch mal spielen dürfen :-)

    Für die Konfiguration des Spiels habe ich die Klasse Settings.cs erstellt

    public class Settings
    {
        private static int _dimensionX = 12;
        public static int DimensionX
        {
            get 
            { 
                return Settings._dimensionX; 
            }
            set { Settings._dimensionX = value; }
        }
     
        private static int _dimensionY = 12;
        public static int DimensionY
        {
            get { return Settings._dimensionY; }
            set { Settings._dimensionY = value; }
        }
     
        private static int _margin = 1;
        public static int Margin
        {
            get { return Settings._margin; }
            set { Settings._margin = value; }
        }
     
        private static GameLevel _level = GameLevel.Normal;
        public static GameLevel Level
        {
            get 
            {
                if (HtmlPage.IsEnabled == false)
                {
                    return _level;
                }
     
                if (IsolatedStorageSettings.ApplicationSettings.Contains("Level"))
                {
                    try
                    {
                        GameLevel level = (GameLevel)IsolatedStorageSettings.ApplicationSettings["Level"];
                        return level;
                    }
                    catch
                    {
                        return _level;
                    }
                }
                return _level; 
            }
            set
            {
                switch (value)
                {
                    case GameLevel.Kindergarten:
                        DimensionX = 6;
                        DimensionY = 6;
                        break;
     
                    case GameLevel.Hammer:
                        DimensionX = 20;
                        DimensionY = 20;
                        break;
     
                    case GameLevel.Normal:
                    default:
                        DimensionX = 12;
                        DimensionY = 12;
                        break;
                        
                }
                IsolatedStorageSettings.ApplicationSettings["Level"] = value;
            }
        }
     
        public enum GameLevel
        {
            Kindergarten,
            Normal,
            Hammer
        }
     
    }

    Zweiter Schritt: Das Basis-Element der “Bubble” in der Klasse Bubbles.xaml und Bubbles.xaml.cs

    <UserControl x:Class="Bubbles.Controls.Bubble"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        Width="Auto" Height="Auto" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignWidth="18" d:DesignHeight="18">
        <Grid x:Name="LayoutRoot" Background="{x:Null}">
            <Grid.RowDefinitions>
                <RowDefinition Height="0.5*"/>
                <RowDefinition Height="0.5*"/>
            </Grid.RowDefinitions>
     
            <Ellipse Stroke="{x:Null}" Grid.RowSpan="2">
                <Ellipse.Fill>
                    <RadialGradientBrush GradientOrigin="0.5,0.987">
                        <RadialGradientBrush.RelativeTransform>
                            <TransformGroup>
                                <ScaleTransform CenterX="0.5" CenterY="0.5" ScaleX="0.782" ScaleY="0.782"/>
                                <SkewTransform CenterX="0.5" CenterY="0.5"/>
                                <RotateTransform CenterX="0.5" CenterY="0.5"/>
                                <TranslateTransform Y="0.114" X="-0.006"/>
                            </TransformGroup>
                        </RadialGradientBrush.RelativeTransform>
                        <GradientStop x:Name="_g0" Color="#FF000000" Offset="1"/>
                        <GradientStop x:Name="_g1" Color="#FFFFFFFF" Offset="0"/>
                    </RadialGradientBrush>
                </Ellipse.Fill>
            </Ellipse>
            <Path Stretch="Fill" Stroke="{x:Null}" Data="M154,78 C155.90759,106.84779 118.52592,63.935123 76,63.935123 C33.474075,63.935123 -0.95520449,109.44034 0,78 C0.78876519,52.037975 34.474075,0 77,0 C119.52592,0 152.05786,48.629925 154,78 z" Margin="0.032,0.085,-0.042,0.389">
                <Path.Fill>
                    <LinearGradientBrush EndPoint="0.506,0.915" StartPoint="0.5,0">
                        <GradientStop Color="#19FFFFFF" Offset="1"/>
                        <GradientStop Color="#BFFFFFFF"/>
                    </LinearGradientBrush>
                </Path.Fill>
            </Path>
     
        </Grid>
    </UserControl>

    Die entsprechende Klasse dazu:

     

    using System.Windows.Controls;
    using System.Windows.Media;
    using System;
     
    namespace Bubbles.Controls
    {
        public partial class Bubble : UserControl
        {
            public Bubble()
            {
                InitializeComponent();
            }
     
            private Color _bubbleColor;
            public Color BubbleColor
            {
                get
                {
                    _bubbleColor = _g0.Color;
                    return _bubbleColor;
                }
                set
                {
                    _bubbleColor = value;
                    _g0.Color = _bubbleColor;
                }
            }
     
     
            internal void Remove()
            {
                //throw new NotImplementedException();
            }
        }
    }

    Die eigentliche Spielfläche (Playground.cs)

    using System;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Media;
    using System.Collections.Generic;
    using System.ComponentModel;
     
    namespace Bubbles.Controls
    {
        public partial class PlayGround : UserControl
        {
            Bubble[,] _bubbleArea;
            Grid _grid;
            MediaElement _sound;
     
            public PlayGround()
            {
                InitializeComponent();
     
                // Only for Design Time
                if (DesignerProperties.GetIsInDesignMode(this))
                {
                    CreatePlayground();
     
                    return;
                }
                
                // Trick to initialize ;-)
                Settings.Level = Settings.Level;
            }
     
            #region Events
     
            public event EventHandler GameFinished;
            public event BubblesRemovedEventHandler BubblesRemoved;
     
            #endregion
     
            #region Eventhandler
     
            void bubble_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
            {
                Bubble bubble = sender as Bubble;
     
                DoBubbleClick(bubble);
            }
     
     
            #endregion
     
            public void Start()
            {
                CreatePlayground();
            }
     
            private void CreatePlayground()
            {
                #region Create Bubble Area
     
                // Create Grid
                _grid = new Grid();
                this.Content = _grid;
     
                // Create Columns
                double width = 1 / Convert.ToDouble(Settings.DimensionX);
                for (int x = 0; x < Settings.DimensionX; x++)
                {
                    ColumnDefinition cd = new ColumnDefinition();
     
                    cd.Width = new GridLength(width, GridUnitType.Star);
                    _grid.ColumnDefinitions.Add(cd);
                }
     
                // Create Rows
                double height = 1 / Convert.ToDouble(Settings.DimensionY);
                for (int y = 0; y < Settings.DimensionY; y++)
                {
                    RowDefinition cd = new RowDefinition();
                    cd.Height = new GridLength(height, GridUnitType.Star);
                    _grid.RowDefinitions.Add(cd);
                }
     
                #endregion
     
                #region Create Bubbles
     
                // Create Bubble
                _bubbleArea = new Bubble[Settings.DimensionX, Settings.DimensionY];
                Random rnd = new Random();
                for (int x = 0; x < Settings.DimensionX; x++)
                {
                    for (int y = 0; y < Settings.DimensionY; y++)
                    {
                        // Create Random Bubble
                        Bubble bubble = new Bubble();
                        bubble.MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(bubble_MouseLeftButtonDown);
     
                        Color color;
                        switch (rnd.Next(5))
                        {
                            case 0:
                                color = Colors.Blue;
                                break;
     
                            case 1:
                                color = Colors.Red;
                                break;
     
                            case 2:
                                color = Colors.Yellow;
                                break;
     
                            case 3:
                                color = Colors.Green;
                                break;
     
                            case 4:
                                color = Colors.Orange;
                                break;
     
                            default:
                                color = Colors.Black;
                                break;
                        }
                        bubble.BubbleColor = color;
                        _bubbleArea[x, y] = bubble;
                    }
                }
     
                #endregion
     
                #region Display Bubbles
     
                // Display Bubbles
                for (int x = 0; x < Settings.DimensionX; x++)
                {
                    for (int y = 0; y < Settings.DimensionY; y++)
                    {
                        Bubble bubble = _bubbleArea[x, y];
                        bubble.Margin = new Thickness(Settings.Margin);
                        bubble.SetValue(Grid.ColumnProperty, x);
                        bubble.SetValue(Grid.RowProperty, y);
                        _grid.Children.Add(bubble);
                    }
                }
     
                #endregion
     
                #region Add Sound
     
                _sound = new MediaElement();
                _sound.Source = new Uri("bubblepop.wma", UriKind.Relative);
                _sound.AutoPlay = false;
                _sound.Volume = 1;
                _grid.Children.Add(_sound);
     
                #endregion 
            }
     
            private void DoBubbleClick(Bubble bubble)
            {
                // Find Surrounding Bubbles
                List<Bubble> surroundingBubbles = new List<Bubble>();
                GetSurroundingBubbles(bubble, surroundingBubbles);
                surroundingBubbles.Add(bubble);
     
                if (surroundingBubbles.Count > 1)
                {
                    RemoveBubbles(surroundingBubbles);
                }
            }
     
            private void RemoveBubbles(List<Bubble> surroundingBubbles)
            {
                if (surroundingBubbles.Count == 0)
                {
                    return;
                }
     
                _sound.Stop();
     
                if (BubblesRemoved != null)
                {
                    BubblesEventArgs args = new BubblesEventArgs();
                    args.BubbleCount = surroundingBubbles.Count;
                    BubblesRemoved(this, args);
                }
     
                _sound.Play();
                
                foreach (Bubble b in surroundingBubbles)
                {
                    for (int x = 0; x < Settings.DimensionX; x++)
                    {
                        for (int y = 0; y < Settings.DimensionY; y++)
                        {
                            if (_bubbleArea[x, y] == b)
                            {
                                _bubbleArea[x, y] = null;
                                b.Remove();
                                b.MouseLeftButtonDown -= bubble_MouseLeftButtonDown;
                                _grid.Children.Remove(b);
                            }
                        }
                    }
                }
     
                LetBubblesFall();
            }
     
            private void LetBubblesFall()
            {
                for (int x = 0; x < Settings.DimensionX; x++)
                {
                    for (int i = 0; i < Settings.DimensionY - 1; i++)
                    {
                        for (int y = Settings.DimensionY - 2; y >= 0; y--)
                        {
                            Bubble bubble = _bubbleArea[x, y];
     
                            if (_bubbleArea[x, y + 1] == null)
                            {
                                // Move Bubble down
                                _bubbleArea[x, y + 1] = _bubbleArea[x, y];
                                _bubbleArea[x, y] = null;
                            }
                        }
                    }
                }
                BubblesToTheRight();
            }
     
            private void BubblesToTheRight()
            {
                for (int y = 0; y < Settings.DimensionY; y++)
                {
                    for (int i = 0; i < Settings.DimensionY - 1; i++)
                        for (int x = 0; x < Settings.DimensionY - 1; x++)
                        {
                            if (_bubbleArea[x + 1, y] == null)
                            {
                                if (_bubbleArea[x, y] != null)
                                {
                                    _bubbleArea[x + 1, y] = _bubbleArea[x, y];
                                    _bubbleArea[x, y] = null;
                                }
                            }
                        }
                }
     
                UpdateBubbles();
            }
     
            private void UpdateBubbles()
            {
                // Display Bubbles
                for (int x = 0; x < Settings.DimensionX; x++)
                {
                    for (int y = 0; y < Settings.DimensionY; y++)
                    {
                        Bubble bubble = _bubbleArea[x, y];
                        if (bubble != null)
                        {
                            bubble.SetValue(Grid.ColumnProperty, x);
                            bubble.SetValue(Grid.RowProperty, y);
                        }
                    }
                }
                CheckForEnd();
            }
     
            private void CheckForEnd()
            {
                bool finished = true;
                for (int x = 0; x < Settings.DimensionX; x++)
                {
                    for (int y = 0; y < Settings.DimensionY; y++)
                    {
                        Bubble bubble = _bubbleArea[x, y];
     
                        List<Bubble> surroundingBubbles = new List<Bubble>();
                        GetSurroundingBubbles(bubble, surroundingBubbles);
     
                        if (surroundingBubbles.Count > 0)
                        {
                            finished = false;
                            break;
                        }
                    }
                }
                if (finished)
                {
                    if (GameFinished != null)
                    {
                        GameFinished(this, EventArgs.Empty);
                    }
                }
            }
     
            private void GetSurroundingBubbles(Bubble bubble, List<Bubble> surroundingBubbles)
            {
                if (bubble == null)
                {
                    return;
                }
     
                int bubbleX = -1;
                int bubbleY = -1;
     
                // Display Bubbles
                for (int x = 0; x < Settings.DimensionX; x++)
                {
                    for (int y = 0; y < Settings.DimensionY; y++)
                    {
                        if (_bubbleArea[x, y] == bubble)
                        {
                            bubbleX = x;
                            bubbleY = y;
                            break;
                        }
                    }
                }
     
                Bubble bubbleToCheck;
     
                // Left Bubble
                if (bubbleX > 0 && bubbleY != -1)
                {
                    bubbleToCheck = _bubbleArea[bubbleX - 1, bubbleY];
                    CheckBubble(bubbleToCheck, bubble, surroundingBubbles);
                }
     
                // Right Bubble
                if (bubbleX < Settings.DimensionX - 1 && bubbleY != -1)
                {
                    bubbleToCheck = _bubbleArea[bubbleX + 1, bubbleY];
                    CheckBubble(bubbleToCheck, bubble, surroundingBubbles);
                }
     
                // Top Bubble
                if (bubbleX != -1 && bubbleY > 0)
                {
                    bubbleToCheck = _bubbleArea[bubbleX, bubbleY - 1];
                    CheckBubble(bubbleToCheck, bubble, surroundingBubbles);
                }
     
                // Bottom Bubble
                if (bubbleX != -1 && bubbleY < Settings.DimensionY - 1)
                {
                    bubbleToCheck = _bubbleArea[bubbleX, bubbleY + 1];
                    CheckBubble(bubbleToCheck, bubble, surroundingBubbles);
                }
            }
     
            private void CheckBubble(Bubble bubbleToCheck, Bubble bubble, List<Bubble> surroundingBubbles)
            {
                if (bubbleToCheck == null)
                {
                    return;
                }
     
                if (bubbleToCheck.BubbleColor == bubble.BubbleColor)
                {
                    if (!surroundingBubbles.Contains(bubbleToCheck))
                    {
                        surroundingBubbles.Add(bubbleToCheck);
                        GetSurroundingBubbles(bubbleToCheck, surroundingBubbles);
                    }
                }
            }
        }
    }

    Die Hauptseite (Page.xaml)

    <UserControl x:Class="Bubbles.Page"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:Bubbles_Controls="clr-namespace:Bubbles.Controls" 
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        mc:Ignorable="d" 
        d:DesignWidth="300" d:DesignHeight="300" MinHeight="300" MinWidth="300" >
        <Grid x:Name="LayoutRoot">
            <Grid.Background>
                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                    <GradientStop Color="#FF000000"/>
                    <GradientStop Color="#FFB9B9B9" Offset="0.906"/>
                    <GradientStop Color="#FF000000" Offset="1"/>
                </LinearGradientBrush>
            </Grid.Background>
     
            <Grid.RowDefinitions>
                <RowDefinition Height="36"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
     
            <Bubbles_Controls:PlayGround x:Name="_playground" Grid.Row="1"/>
     
            <TextBlock HorizontalAlignment="Left" x:Name="_header" VerticalAlignment="Top" FontSize="20" Text="Bubbles" TextWrapping="Wrap" Foreground="#FFFFFFFF" FontFamily="Comic Sans MS"/>
            <TextBlock HorizontalAlignment="Right" x:Name="_points" VerticalAlignment="Center" Text="0" TextWrapping="Wrap" Foreground="#FFFFFFFF" Margin="0,0,0,0" FontFamily="Comic Sans MS" FontSize="20"/>
            <StackPanel HorizontalAlignment="Left" Margin="82,0,0,0" Width="Auto" Orientation="Horizontal" VerticalAlignment="Center">
                <Button Content="Start" d:LayoutOverrides="Width" x:Name="_startButton" Foreground="#FFFFFFFF" Template="{StaticResource ButtonControlTemplate1}" FontSize="8"/>
     
                <Button Margin="4,0,0,0" x:Name="_optionsButton" Foreground="#FFFFFFFF" Template="{StaticResource ButtonControlTemplate1}" Content="Optionen" FontSize="8"/>
                <Button x:Name="_highScoreButton" Foreground="#FFFFFFFF" Template="{StaticResource ButtonControlTemplate1}" Content="Highscore" Height="24" Width="66" FontSize="8"/>
            </StackPanel>
            <Grid x:Name="_optionsGrid" Grid.RowSpan="2" Background="#7F000000">
                <Bubbles_Controls:Options Height="Auto" Margin="0,0,0,0" x:Name="_options" VerticalAlignment="Stretch"/>
            </Grid>
            <Grid x:Name="_highScoreGrid" Background="#7F000000" Grid.RowSpan="2">
                <Bubbles_Controls:HighScore HorizontalAlignment="Center" VerticalAlignment="Center" x:Name="_highScore" Margin="20,20,20,20"/>
            </Grid>
            <Grid Height="Auto" HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch" Width="Auto" Grid.Row="0" x:Name="_nameGrid" Grid.RowSpan="2" Background="#7F000000">
                <Bubbles_Controls:EnterNameControl BorderThickness="0,0,0,0" Margin="0,0,0,0" d:LayoutOverrides="Height" HorizontalAlignment="Center" VerticalAlignment="Center" x:Name="_nameControl"/>
            </Grid>
     
        </Grid>
    </UserControl>

    Plus die Codebehindklasse (Page.xaml.cs)

    using System;
    using System.Windows;
    using System.Windows.Controls;
    using System.ComponentModel;
     
    namespace Bubbles
    {
        public partial class Page : UserControl
        {
            public Page()
            {
                InitializeComponent();
     
                _playground.GameFinished += new EventHandler(_playground_GameFinished);
                _playground.BubblesRemoved += new BubblesRemovedEventHandler(_playground_BubblesRemoved);
                _startButton.Click += new RoutedEventHandler(_startButton_Click);
                _optionsButton.Click += new RoutedEventHandler(_optionsButton_Click);
                _options.Closed += new EventHandler(_options_Closed);
                _highScore.Closed += new EventHandler(_highScore_Closed);
                _highScoreButton.Click += new RoutedEventHandler(_highScoreButton_Click);
                _nameControl.NameSaved += new Bubbles.Controls.SaveNameEventHandler(_nameControl_NameSaved);
     
                if (!DesignerProperties.GetIsInDesignMode(this))
                {
                    _optionsGrid.Visibility = Visibility.Collapsed;
                    _highScoreGrid.Visibility = Visibility.Collapsed;
                    
                    _nameGrid.Visibility = Visibility.Collapsed;
     
                    // Init Trick
                    Settings.Level = Settings.Level;
                }
            }
     
            void _nameControl_NameSaved(object sender, Bubbles.Controls.SaveNameEventArgs args)
            {
                HighScores.AddHighscore(args.Name, _points.Text, Settings.Level);
                _nameGrid.Visibility = Visibility.Collapsed;
                _highScoreGrid.Visibility = Visibility.Visible;
                _highScore.ShowHighscore();
            }
     
            void _highScore_Closed(object sender, EventArgs e)
            {
                _highScoreGrid.Visibility = Visibility.Collapsed;
            }
     
            void _highScoreButton_Click(object sender, RoutedEventArgs e)
            {
                _highScoreGrid.Visibility = Visibility.Visible;
            }
     
            void _options_Closed(object sender, EventArgs e)
            {
                _optionsGrid.Visibility = Visibility.Collapsed;
            }
     
            void _optionsButton_Click(object sender, RoutedEventArgs e)
            {
                _optionsGrid.Visibility = Visibility.Visible;
            }
     
            void _playground_BubblesRemoved(object sender, BubblesEventArgs args)
            {
                UpdatePoints(args.BubbleCount);
            }
     
            private void UpdatePoints(int bubbles)
            {
                int points = int.Parse(_points.Text);
                points += bubbles * bubbles;
                _points.Text = points.ToString();
            }
     
            void _startButton_Click(object sender, RoutedEventArgs e)
            {
                StartGame();
            }
     
            private void StartGame()
            {
                _playground.Opacity = 1;
                _points.Text = "0";
                _playground.Start();
            }
     
            void _playground_GameFinished(object sender, EventArgs e)
            {
                _playground.Opacity = .5;
                _nameGrid.Visibility = Visibility.Visible;
                
            }
        }
    }

    Es gehören noch einige Elemente mehr hinzu, wie z.B. Highscores, Namenseingabe und das Setzen des Spiellevels über die Optionen.

  • o-LIVE-r

    Hinweis: Aktualisieren Sie Windows 7 Beta rechtzeitig auf den Release Candidate

    • 0 Comments

    Nutzer der Beta-Version von Windows 7 sollten bis zum 1. Juli 2009 den Umstieg auf den Release Candidate vollzogen haben. Denn nach diesem Datum ist die Beta-Version nur noch bis zum 1. August und, durch zweistündliches Herunterfahren, sehr eingeschränkt nutzbar - etwa für letzte Datensicherungen. Zwei Wochen vor dem kritischen Termin wird die Beta-Version Sie mit entsprechenden Warnhinweisen an diese Einschränkungen erinnern.

  • o-LIVE-r

    Silverlight 2 – Kleine Grafiktrickkiste

    • 0 Comments

    Gerade habe ich einen neuen Webcast zu Silverlight 2 erstellt und dort meine drei Lieblingskniffe erläutert.

    Buttons (mein Lieblingsdesign-Thema :-) )

    image

    Noch mehr Buttons

    image

    Reflektionen

    image

    Ampeln mit dem Visual State Manager

    image

    Der Code dazu kann hier herunter geladen werden:

  • o-LIVE-r

    „Empower Your Site Awards 2009“: Microsoft prämiert Add-Ons für den Internet Explorer 8

    • 0 Comments

    Pünktlich zur Einführung des Web-Browsers „Internet Explorer 8“ hat Microsoft Deutschland unter dem Motto „Empower Your Site“ einen Wettbewerb für Webmaster und Web-Programmierer gestartet. Aufgabe dabei ist es, innovative Lösungen für die neuen Browser-Funktionen „Schnellinfo“ und „Web Slices“ zu kreieren, die im Internet Explorer 8 Premiere feiern. Microsoft macht die attraktivsten Wettbewerbsbeiträge auf seinen Websites einer breiten Öffentlichkeit zugänglich; die besten Einsendungen werden darüber hinaus mit dem „Empower Your Site Award“ (EYSA) ausgezeichnet. Zu gewinnen gibt es u.a. Notebooks, Xbox360-Konsolen inkl. Spiele und Desktop-Sets. Einsendeschluss ist der 5. Oktober 2009. Infos zur Teilnahme und Tipps für die perfekte Realisierung von Schnellinfos und Webslices für den Internet Explorer 8 liefert die Website www.eysa.de.

  • o-LIVE-r

    TechTalk Juni 2009: Parallele Programmierung mit Visual Studio 2010 und Intel® Parallel Studio

    • 0 Comments

    Die Etablierung von Mehrprozessorsystemen bedeutet für den Anwendungsentwickler, dass ein Performancegewinn durch zusätzliche Prozessorkerne nur noch dann stattfindet, wenn die vorhandene Software angemessen parallelisiert und skaliert. Allerdings ist die Parallelisierung einer Anwendung nicht unbedingt einfach. Die Kenntnisse über die vorhandene Hardware, das Betriebssystem und die Entwicklungsumgebung stellen hier oft eine große Hürde dar. Gleiches gilt für die vorhandenen APIs, die man benutzen kann, um eine Anwendung vollständig oder in Teilen zu parallelisieren.

    Deshalb steigt gerade jetzt - im Zeitalter der Mehrkernprozessoren - der Bedarf nach geeigneten Methoden, um verschiedene Anwendungsteile parallel ablaufen zu lassen. Genau hier setzen Intel und Microsoft an. In diesem MSDN TechTalk werden Mario Deilmann von Intel und Dariusz Parys von Microsoft die verschiedenen Technologien und Tools im Bereich C/C++ und C# erklären, die es dem Entwickler erlauben, auf einer abstrakteren Ebene parallele Ausführungspfade zu definieren. Erleben Sie dabei die Verwendung von Intel® Parallel Studio und einen Ausblick auf die Parallel Extensions des .NET Framework 4.0 vom kommenden Visual Studio 2010.

    Dieser MSDN TechTalk richtet sich an alle Entwickler, die vor der Frage stehen, wie man eine Anwendung geeignet parallelisiert, egal ob native C++, C#, Visual Basic.

    Die Termine:

    08.06. Karlsruhe

    09.06. München

    15.06. Köln

    22.06. Hamburg

    29.06. Berlin

    30.06. Dresden

  • o-LIVE-r

    Windows 7 Release Candidate für MSDN Subscriber verfügbar

    • 0 Comments

    Inhaber einer MSDN Subscription können ab sofort den offiziellen Release Candidate (RC) von Windows 7 herunterladen. Zur Verfügung stehen auch deutschsprachige Versionen, natürlich sowohl für 32- wie auch für 64-Bit-Architekturen. Der Status "Release-Kandidat" sagt aus, dass diese Vorabversion bereits über sämtliche für das fertige Produkt vorgesehene Funktionalität verfügt, gewährt dazu aber noch keine grundsätzliche Fehlerfreiheit: Download Windows 7 RC auf MSDN Online.
    Interessenten ohne MSDN-Abonnement erhalten ab dem 5. Mai 2009 Gelegenheit zum Download. Im MSDN Windows Developer Center finden Sie auch weiterführende Informationen.

  • o-LIVE-r

    1&1 Studentenserver

    • 0 Comments

    Schade das ich kein Student mehr bin.

    clip_image002

  • o-LIVE-r

    Internet Explorer 8-Podcast

    • 0 Comments

    Bereits am 17. März 2009 wurde der Internet Explorer 8-Podcast zwischen Kai Schätzl (Microsoft MVP für Internet Explorer) und Kay Giza (Microsoft) aufgezeichnet. In dem gut eineinhalb Stunden langen Podcast unterhalten sich die beiden Web-Experten über häufig gestellte Fragen zum Internet Explorer 8 aus den Newsgroups und deren Antworten,  über Installationsprobleme und wie man diese am schnellsten löst. Themen wie Schnellinfos, verbesserte Navigation, Sofortsuche, Web Slices und Sicherheitsthemen wie InPrivate-Browsen oder InPrivate-Filterung sowie viele weitere Themen werden behandelt. Details und Download-Links entnehmen Sie bitte diesem Forum-Posting auf dem MSDN Forum zum Internet Explorer. Dort können Sie auch gleichzeitig Feedback und Themenwünsche zu zukünftigen Podcasts rund um den Internet Explorer abgeben.

  • o-LIVE-r

    MSDN Training- und Zertifizierungsressourcen

    • 0 Comments

    Für Entwickler, die ihre Kenntnisse im Bereich der IT erweitern und ihr Wissen unter Beweis stellen wollen, bietet Microsoft seit mehr als zehn Jahren das Microsoft Certified Professional Program (MCP-Programm) in Zusammenarbeit mit anerkannten Trainingsanbietern an. Mehr über aktuelle Trainingsangebote für Entwickler erfahren Sie in der Rubrik „Lernen“ von MSDN Online. Hier finden Sie das richtige Training um Ihr Wissen auf dem neuesten Stand zu halten. Lernen Sie, wie es Ihnen am meisten liegt – schauen sie sich ein Video an, nehmen Sie an einem Kurs teil oder lesen Sie ein Buch – entsprechend Ihrem Wissensstand, egal ob Sie noch Einsteiger oder schon Profi sind. Ob Trainings, Kurse, Workshops, Webcasts, CodeClips, Bücher, Technische Artikel oder  Zertifizierungen – die Mitte April 2009 neugestaltete „Learning-Seite“ für Entwickler enthält zahlreiche Einstiegspunkte für die Weiterbildung. Jetzt informieren: http://msdn.microsoft.com/de-de/bb188199.aspx

  • o-LIVE-r

    Neues Webcast-Format im MRD-Format

    • 0 Comments

    Heute wird erstmals das MRD-Verfahren (Multilayer-Recording And Displaying), welches bei Microsoft Research entwickelt wurde, für ein neues Lernformat verwendet.

    Dieses Lernformat hat das Potential die aktuellen und seit heute veralteten webbasierten Präsentationstechnologien in den Schatten zu stellen.

    Extrem sehenswert:
    http://www.microsoft.com/germany/msdn/webcasts/library.aspx?id=1032410282

  • o-LIVE-r

    Damit bloß keiner auf „Abbrechen“ klickt: So gestalten Sie die optimale Installationsaufforderung für Silverlight

    • 0 Comments

    Auch wenn Silverlight inzwischen binnen weniger als 18 Monaten auf mittlerweile über 350 Millionen Computern installiert wurde, so gibt es immer noch eine Handvoll jungfräuliche Rechner, auf denen Silverlight beim ersten Aufrufen einer Rich Internet Application wie jedes andere Browser-Plugin einmalig installiert werden muss.


    Vermutlich liegt es daran dass die meisten Entwickler keine Marketingausbildung hinter sich haben, denn der eigentlich logische Grundsatz „Mach den Besucher zuerst neugierig und wecke ernsthaftes Interesse für Dein Angebot – und dann mach es ihm/Ihr so einfach und angenehm wie möglich, die Installationshürde zu nehmen“ scheint viel zu oft vernachlässigt zu werden. Sprich: Eine große Anzahl Silverlight-Websites legt leider immer noch viel zu wenig Wert auf eine gute, überzeugende und vor allem effektive Installationsaufforderung für die Silverlight-Runtime (wenn der Anwender noch kein Silverlight auf seinem Rechner haben sollte).


    Allerdings ist gerade die Entscheidung zur Installation meist die größte Hürde – und eine rein psychologische dazu. Zumindest wenn der Prozess schlecht implementiert wird. Technisch ist die Installation keine Herausforderung. Sie dauert im Schnitt nur 20 Sekunden und drei Klicks – der Besucher muss nur effektiv dazu animiert werden, diese 20 Sekunden auch zu investieren. Studien haben gezeigt dass die Conversion Rate (die Anzahl der Anwender die das Silverlight-Plugin bei Aufforderung installieren) je nach Art und Weise der Installationsaufforderung tatsächlich zwischen „fast alle“ (also irgendwo im Bereich von 95%) und „fast keiner“ (weniger als 5% der Besucher) schwanken kann.


    Um Designern und Entwicklern zu helfen die Conversion Rate ihrer Website in Richtung 95% (oder mehr) zu treiben, hat Microsoft ein englischsprachiges Whitepaper mit dem Titel „CREATING A CUSTOM SILVERLIGHT INSTALLATION EXPERIENCE“ veröffentlicht, in dem alle wichtigen Fragen zum Thema „Wie funktioniert eine effektive Installationsaufforderung für Silverlight?“ beantwortet werden.


    Die ausführliche Anleitung zur Implementierung eines besseren Silverlight-Installationserlebnisses mit vielen hilfreichen Tipps und Beispielcode finden Sie hier: CREATING A CUSTOM SILVERLIGHT INSTALLATION EXPERIENCE

  • o-LIVE-r

    Community: MSDN Windows Forum

    • 0 Comments

    Sie können sich mit Entwicklern im offiziellen Windows 7-Forum oder Windows Vista-Forum auf MSDN Online austauschen und Fragen oder Anregungen diskutieren. Besuchen Sie auch den Microsoft Community Guide und entdecken Sie eine Auswahl der besten deutschsprachigen Communities, Anwendergruppen und Blogger rund um das Windows-Betriebssystem.

  • o-LIVE-r

    WPF? Fast Start!

    • 0 Comments

    Was ist WPF Fast Start?

    Alte und neue Technologien in eine funktionierende Lösung zusammenführen – eine immerwährende Aufgabe für Softwareentwickler. Diesen, die bisher keine Möglichkeit hatten, Windows Presentation Foundation (WPF) zu evaluieren, soll nun der Einstieg besonders leicht gemacht werden. Dazu wird Microsoft auf MyMSDN für Softwarehersteller (www.mymsdn.de/isv) eine WPF-Komponente bereitstellen, die Entwickler in maximal 15 Minuten einsetzen und testen können. Diese WPF-Komponente können Entwickler entweder in ihre vorhandenen Anwendungen integrieren oder innerhalb der Beispielanwendungen testen, die ebenfalls bereitstellt werden. Es existieren schon sehr viele Stand-Alone-Beispiele zu WPF; bei WPF Fast Start steht allerdings die Integration in bestehende Anwendungen im Vordergrund.

    Link: http://mymsdn.de/isv

    Die WPF-Komponente in WPF Fast Start ist eine Adress-Visualisierung im bekannten Cover Flow – und so sieht sie aus:

    clip_image001

  • o-LIVE-r

    „Ich suche…“ - „Ja, haben wir!“ – Der allesfindende MSDN Finder ist da!

    • 0 Comments

    Mit dem neuen MSDN Finder ist jetzt Schluss mit Suchen. Durchstöbern und erkunden Sie jetzt die derzeit nahezu 3.500 Inhalte der MSDN Webcast-, MSDN Solve- und MSDN Mediathek-Rubriken von einem einzigen Ort aus und benutzen Sie die umfangreichen Sortier- und Filtermöglichkeiten um genau die Ergebnisse zu erhalten, die für Sie relevant sind. Mit zusätzlichen Funktionalitäten ausgestattet ist der MSDN Finder eine konsequente Weiterentwicklung aus dem Ihnen altbekannten MSDN Webcastfinder, dem MSDN Solve Finder und der MSDN Mediathek und wartet darauf Ihr Arbeiten mit Multimediainhalten und technischen Ressourcen auf MSDN Online noch effizienter zu gestalten. Über Feedback und Fragen zum neuen Finder freuen wir uns sehr!
    Mehr Informationen: MSDN Finder

  • o-LIVE-r

    So gestalten Sie die optimale Installationsaufforderung für Silverlight

    • 0 Comments

    Wie jedes Browserplugin muß Silverlight beim ersten Aufrufen einer Silverlight-Website einmalig installiert werden. Technisch ist die Installation keine Herausforderung. Sie dauert im Schnitt nur 20 Sekunden und drei Klicks – der Besucher muss nur effektiv dazu animiert werden, diese 20 Sekunden auch zu investieren. Studien haben gezeigt dass die Conversion Rate (die Anzahl der Anwender die das Silverlight-Plugin bei Aufforderung installieren) je nach Art und Weise der Installationsaufforderung tatsächlich zwischen „fast alle“ (also irgendwo im Bereich von 95%) und „fast keiner“ (weniger als 5% der Besucher) schwanken kann. Im offiziellen deutschen Silverlight-/Expression-Blog finden Sie jetzt einen hilfreichen Artikel in dem alle wichtigen Fragen zum Thema „Wie funktioniert eine effektive Installationsaufforderung für Silverlight?“ beantwortet werden: http://blogs.msdn.com/riablog/archive/2009/04/20/damit-blo-keiner-auf-abbrechen-klickt-so-gestalten-sie-die-optimale-installationsaufforderung-f-r-silverlight.aspx

Page 1 of 1 (25 items)