o-LIVE-r

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

  • o-LIVE-r

    HTML in Silverlight darstellen

    • 1 Comments

    HTML ist ein sehr beliebtes Format zur Formatierung von Text … okay … es wurde genau dafür und nur dafür erfunden. Es scheiden sich immer noch die Geister darüber ob es wirklich eine Programmiersprache ist. Das stimmt auf jedenfall wenn man HTML+JavaScript zusammen betrachtet.

    Was in Silverlight nicht direkt möglich ist, ist die Darstellung von HTML formatierten Text, wie z.B. <b>fett</b> und <i>kursive"</b>

    Allerdings hat einer meiner englischsprachigen Kollegen dieses “Potential” erkannt …

    http://blogs.msdn.com/delay/archive/2007/09/10/bringing-a-bit-of-html-to-silverlight-htmltextblock-makes-rich-text-display-easy.aspx

    Damit lassen sich einfache HTML-Texte leicht in Silverlight integrieren.

    Ein Live-Beispiel dafür gibt es hier: http://cesso.org/Samples/SilverlightHtmlTextBlock/ 

    Eine Silverlight 3 Variante davon habe ich in meinen SL3-Trainingskit integriert unter: http://www.the-oliver.com/sl3training

    image

  • o-LIVE-r

    Surface Development Webcasts

    • 0 Comments

    Meine Kollegin Jennifer Marsman hat in den letzten Tagen einige sehr spannende Surface Webcasts aufgenommen.

    Surface Development Part 1: What is the Microsoft Surface?

    Surface Development Part 2: Surface Controls

    Surface Development Part 3: ScatterView

    Surface Development Part 4: Reacting to Physical Objects

    Surface Development Part 5: Futures and Resources

  • o-LIVE-r

    Rich Text Editor für Silverlight

    • 0 Comments

    Hier gibt es sie …

    http://www.vectorlight.net (free)

    http://www.devexpress.com/Products/NET/Controls/Silverlight/Rich_Editor

    http://www.componentone.com/SuperProducts/StudioSilverlight

  • o-LIVE-r

    IIS SEO Toolkit verfügbar

    • 0 Comments

    Seit gestern steht das IIS SEO (Search Engine Optimization) Toolkit zum Download bereit.

    Am leichtesten geht die Installation über den Web PI (Platform Installer) …

    Mehr Infos unter dem folgenden Link: http://www.microsoft.com/web/downloads/platform.aspx

  • o-LIVE-r

    GameCamp Munich bei Microsoft

    • 0 Comments

    Das GameCamp Munich findet am 20.-21. Juni bei Microsoft in Unterschleißheim statt.  Das GameCamp Munich ist ein Event von und für alle, die sich für Games und das Games-Business interessieren.  Ziele des Camps sind die interdisziplinäre Vernetzung der Branche, die Entwicklung neuer Thesen und Ideen sowie die Förderung der Videospielkultur. Eingeladen sind alle, die Teil der Games-Branche sind oder sein wollen: Programmierer und Designer, Künstler und Publisher, Marketing und PR, Studenten, Modder, Blogger und natürlich die Presse.

    GameCamp basiert auf den Grundlagen eines BarCamps und unterscheidet sich von anderen Konferenzen dahingehend, dass die Themen nicht Monate im Voraus vom Veranstalter festgelegt werden. Stattdessen wählen alle Teilnehmer noch bis kurz vor Beginn der Sessions aus, worüber gesprochen werden soll. Alle Teilnehmer sind aufgefordert, selbst einen Vortrag zu halten oder zu organisieren.

    Die Teilnahme am GameCamp Munich ist kostenlos.  Mehr Information und Anmeldung zum GameCamp Munich finden Sie hier:  http://www.gamecampmunich.de

  • o-LIVE-r

    Organisation von XAML-basierten Projekten

    • 0 Comments

    Meine Kollegen Jamie Rodriguez und Adam Kinnley haben mit Experten aus der Industrie eine kleine Videoreihe erstellt. In dieser werden Fragen zum Thema “Wie strukturiert man am besten seine XAML-basierte Anwendungen”.

    Teil 1:
    http://channel9.msdn.com/shows/Continuum/XAML-Guidelines-Part-1/

    Teil 2:
    http://channel9.msdn.com/shows/Continuum/XAML-Guidelines-Part-2/

  • o-LIVE-r

    Sparkassen-Fotowettbewerb mit Silverlight

    • 0 Comments

    Die Sparkasse Duisburg sucht derzeit das “Sparkassengesicht 2009”. Und das mit einer sehr netten Silverlight-Anwendung.

    image

    Live zu sehen unter: http://www.sparkassengesicht.de/Voting.html

  • o-LIVE-r

    Microsoft WorldWide Telescope in Silverlight

    • 0 Comments

    Wer gerne mal in den Sternenhimmel guckt, der ist hier richtig aufgehoben.

     

    image 

    Link: http://www.worldwidetelescope.org/webclient/

  • o-LIVE-r

    Meinen Weblog auf Deiner Webseiten einbinden?

    • 0 Comments

    Dieses Posting ist für alle interessierten Webmaster gedacht, aber auch für mich selbst, um bei erneuten Anfragen zur Content-Syndication bezüglich Inhalte von meinem Weblog, darauf zu referenzieren.
    Für ausgewählte Bereiche des MSDN Online-Portals in Deutschland stehen ja schon seit einiger Zeit RSS-Feeds zur Verfügung, die automatisch über neue Inhalte informieren. Dabei erhält man nicht nur werktäglichen News, sondern auch Infos zu technischen Ressourcen wie Webcasts, CodeClips, Artikel oder Bücher sowie zu Veranstaltungen. Mit dem neuen MSDN RSS Konfigurator lassen sich problemlos in wenigen Schritten diese Inhalte auf Webseiten integrieren und anzeigen. Seit einigen Tagen ist nun dort auch mein Weblog gelistet. Da ich doch öfters mal die Frage bekomme, ob man z.B. den RSS-Feed meines Weblogs woanders darstellen darf, hier nun die offizielle Antwort:
    Wenn man den MSDN RSS Konfigurator dafür nutzt, darf man dies sehr gerne und ich würde mich sehr freuen, wenn man diese Art der Content-Syndication nutzen würde.
    Fragen zum Konfigurator oder Feedback können auf MSDN Online im Forum gestellt und diskutiert werden.

  • o-LIVE-r

    Html in Silverlight darstellen, die Zweite

    • 0 Comments

    Derzeit (Silverlight 3) ist es nicht direkt möglich HTML in Silverlight direkt darzustellen. Allerdings kann man sich mittels HTML und einem DIV über dem Silverlight-Control einfach behelfen.

    Allerdings kann man sich auch den unten folgenden Links bedienen um eben Text mit HTML-formatiert in Silverlight direkt einzubinden.

    http://www.vectorlight.net/tutorials/rendering_html_in_silverlight_2.aspx

    http://blogs.msdn.com/delay/archive/2007/09/10/bringing-a-bit-of-html-to-silverlight-htmltextblock-makes-rich-text-display-easy.aspx

    https://www.componentone.com/SuperProducts/HtmlHostSilverlight/

  • o-LIVE-r

    Search Engine Optimization mit Silverlight

    • 0 Comments

    Mein Kollege hat einige sehr interessante Beiträge zum Theme Suchmaschinenoptimierung / Search Engine Optimization/SEO veröffentlich.

    http://blogs.msdn.com/waldred/archive/2009/03/23/Search-Engine-Optimization-for-Silverlight-Applications.aspx

    http://blogs.msdn.com/waldred/archive/2009/03/24/search-engine-optimization-for-silverlight-applications-part-2.aspx

    Zusätzlich gibt es seit einigen Tagen im Web PI (Microsoft Web Platform Installer) kostenfrei ein SEO-Toolkit für den IIS. Link: Microsoft Web Platform

  • o-LIVE-r

    Druckbetankung – Die Show: Einführung Silverlight 2

    • 0 Comments

    Im ersten Teil unseres neuen Formates "Druckbetankung - Die Show" erzählen Oliver Scheer und ich alles über Silverlight 2. Alles? Nicht ganz, aber wir fangen bei den Basics an, zeigen, welche Voraussetzungen man für die Silverlight-Entwicklung benötigt, wo Stolpersteine liegen könnten und wie man zu seiner ersten Silverlight Applikation kommt und diese auf seiner Seite einbindet.
    In den kommenden Teilen wird dieses Wissen dann vertieft bis zur Datenbindung und zum Cross-Domain-Access.
    Ausserdem seht ihr das Zusammenspiel zwischen Visual Studio 2008 und Expression Blend 2 SP1.

    Druckbetankung - Die Show -- Silverlight Teil I

    Im zweiten Teil der Silverlight-Serie "Druckbetankung - Die Show" bauen Oliver Scheer und ich einen RSS-Reader in Expression Blend 2 SP1 und Visual Studio. Was muss so ein Silverlight RSS-Reader können? Und wie kann man das mit wenig Code umsetzen?
    Am Ende haben wir ein funktionales, wenn auch nicht unbedingt schönes Grundgerüst mit Cross-Domain-Zugriff per WebService aus der Windows Communication Foundation (WCF), interaktiver Suche per Language Integrated Query (LINQ) und Datenbindung der Ergebnisse an eine ListBox.

    Druckbetankung - Die Show -- Silverlight Teil II

    In Teil 3 unserer Serie "Druckbetankung - Die Show" geht es um Beautifying, Templates, Ressourcen, Styling und Skinning. Oliver Scheer und ich haben in den vorangegegangenen Webcasts bereits eine fertige Anwendung aus Entwicklersicht gebaut, denn alle wichtigen Funktionen sind integriert. Aber so richtig benutzbar und schön ist das Ganze noch nicht. Also nochmal ran mit Expression Blend und die Anwendung mit eigens entworfenen Buttons, einem animierten UserControl für die Zeit des Nachladens und ein paar Farbverläufe sollten auch noch drin sein.

    Druckbetankung - Die Show -- Silverlight Teil III

  • o-LIVE-r

    Druckbetankung – Die Show: Silverlight 3

    • 0 Comments

    In diesem ersten Teil unserer Silverlight3-Serie "Druckbetankung - Die Show" geht es um Grundsätzliches, von den Voraussetzungen für Silverlight 3, über die Installation zu der neuen Features. Ausserdem installieren und zeigen ein paar Details der Blend 3 Preview, zum Beispiel die dort integrierte IntelliSense-Unterstützung.
    Alles zum Ausprobieren und Nachmachen, wie immer auf unterhaltsame Art präsentiert von Oliver Scheer und meiner Wenigkeit.

    Druckbetankung - Die Show -- Silverlight 3 Teil I

    Im zweiten Teil unserer Staffel Silverlight 3 der Serie "Druckbetankung - Die Show" (ihr seht, wir haben uns Gedanken gemacht, wie das richtige Wording aussehen soll (= ) seht ihr die Navigation Templates, die neu in Silverlight 3 sind. Navigation Templates vereinfachen das Konzept der Seitentransparenz in Silverlight, so dass einzelne Inhalte einer Silverlight-Applikation auch per URL angesteuert werden und von Suchmaschinen so direkt indiziert werden können. Wie das Ganze funktioniert und wo noch weitere Vorteile liegen erfahrt ihr im Video!

    Druckbetankung - Die Show -- Silverlight 3 Teil II

    Der dritte Teil unserer Silverlight 3 Staffel der Serie Druckbetankung befasst sich mit der Out-of-Browser-Funktionalität, die in Silverlight 3 neu hinzugekommen ist. Diese ermöglicht es dem User, eine Web-Silverlight-Applikation auf dem Desktop bzw. lokal auf dem PC abzulegen, und von dort wie gewohnt zu verwenden, ohne dass ein Browser involviert ist. Oliver Scheer und ich zeigen, wie man seine Applikation Out-of-Browser-Ready macht, und welche zusätzlichen Möglichkeiten der Programmierung dadurch möglich werden. Wir zeigen, wie man der Applikation beibringt zu wissen, ob sie im Browser oder lokal läuft und wie man den Onlinestatus überprüft.

    Druckbetankung - Die Show -- Silverlight 3 Teil III

    Im vierten Teil unserer Staffel Silverlight 3 der Serie "Druckbetankung - Die Show" erklären Oliver Scheer und ich das Thema Animation und Storyboarding in Expression Blend 3. Ausserdem kommt das Thema "Easing Functions" zur Sprache. Easing Functions erleichtern dank vorgegebener Bewegungsabläufe die natürliche Animation von Objektbewegungen.

    Druckbetankung - Die Show -- Silverlight 3 Teil IV

    Im fünften Teil der Staffel Silverlight 3 aus der Serie "Druckbetankung - Die Show" geht es um das Binden von Elementeigenschaften an die Werte der Eigenschaften anderer Elemente. Das Sogenannte Element-to-Element Binding ist dafür verantwortlich, dass man in Silverlight mit Hilfe eines Sliders beispielsweise die Darstellungsgröße eines Textes verändern kann. An einem praktischen Beispiel zeigen Oliver Scheer und ich wie diese Technik verwendet wird.

    Druckbetankung - Die Show -- Silverlight 3 Teil V

    In Teil sechs der Staffel Silverlight 3 aus der Serie "Druckbetankung - Die Show" dreht sich alles um die Plane Projection, die 3D-Projektion in Silverlight 3. Diese Projektion lässt sich sowohl in Expression Blend 3 verändern, als auch an Eingabefelder, beispielsweise Slider, binden und so in der Anwendung selber interaktiv verändern. Oliver Scheer und ich programmieren uns explorativ durch die Möglichkeiten der 3D-Projektion.

    Druckbetankung - Die Show -- Silverlight 3 Teil VI

  • o-LIVE-r

    Touch Pack für Windows 7

    • 0 Comments

    Das Windows 7 Team stellt in einen sehr interessanten Artikel das Touch Pack für Windows 7 vor.

    http://windowsteamblog.com/blogs/windows7/archive/2009/05/27/introducing-the-microsoft-touch-pack-for-windows-7.aspx

  • o-LIVE-r

    Software für Windows Mobile 6.x entwickeln – wie fange ich an?

    • 0 Comments

    Mein Kollege Dr. Mobile aka Frank Prengel hat gerade einen sehr umfangreichen Artikel über die Entwicklung von Anwendungen für mobile Endgeräte mit Windows Mobile 6.x geschrieben. Sehr lesenswert.

    http://blogs.msdn.com/frankpr/archive/2009/06/09/software-f-r-windows-mobile-6-x-entwickeln-wie-fange-ich-an.aspx

  • o-LIVE-r

    Xtopia [kompakt] 09: Videos und Vorträge jetzt als Download verfügbar…

    • 0 Comments

    Die erste Xtopia [kompakt]-Roadshow rund um die Themen Web/UX und Rich Internet Applications war ein voller Erfolg. Von April bis Mai 2009 waren wir mit  Microsoft und anderen hochkarätigen Partnern auf der Xtopia im Kleinformat unterwegs: In München, Karlsruhe, Hamburg, Köln, Berlin und Frankfurt erlebten jeweils bis zu 100 Teilnehmer Vorträge und Demos zu den Themen Web, User Experience und Silverlight/Rich Internet Applications.

    clip_image002

    Wenn Sie in diesem Jahr keine Zeit hatten, bei Xtopia [kompakt] dabei zu sein, finden Sie auf der Website der Xtopia [kompakt] ab sofort (fast) alle Vorträge als PDF, viele Videos und umfangreiche Informationen rund um die Inhalte der vergangenen Roadshow. Im Mittelpunkt stehen Microsoft Surface, Windows 7, Silverlight 3 und Internet Explorer 8. Partner wie PC-Ware und das deutsche RIA-Forum begleiteten uns auf der Roadshow. Agenturen aus der Design- und Webbranche ergänzten die Vorträge mit Erfahrungsberichten zu Design, User Experience, Rich Internet Applications und Webentwickung. Beispielsweise zeigte CRM-Spezialist CAS in einem Vortrag die Vorteile von Silverlight gegenüber AJAX und Flash bei der Entwicklung professioneller Unternehmensanwendungen auf. Weitere Erfahrungsberichte kamen von Quark, Ergosign, maximago, Pixelpark AG, T-Systems MMS, UID, Perun.net und Sensory Minds.

    Hier entlang zu den gesammelten Präsentationen der XTOPIA [kompakt] 09  und den Session-Videos: http://blogs.msdn.com/riablog/archive/2009/06/09/xtopia-kompakt-09-videos-und-vortr-ge-jetzt-als-download-verf-gbar.aspx bzw.  http://snipurl.com/jtiex

  • o-LIVE-r

    Kostenlose Silverlight-Entwicklungstools

    • 0 Comments

    Mit dem kostenlosen Visual Web Developer Express mit ServicePack ist auf jeden Fall Silverlight-Entwicklung möglich: http://www.microsoft.com/germany/express/product/visualwebdeveloperexpress.aspx

    Im deutschsprachigen Silverlight-Developer-Center gibt’s haufenweise Infos zu Silverlight-Entwicklung: http://msdn.microsoft.com/de-de/silverlight/default.aspx

    Meine zehnteilige Video-Einführung in SL2: http://www.microsoft.com/germany/msdn/webcasts/serien/MSDNWCS-0806-01.mspx

    Das SDK ist hier: http://silverlight.net/GetStarted/ (englisch)

  • o-LIVE-r

    Silverlight 3: 3D ImageGrid erstellen

    • 0 Comments

    Ich habe vor einigen Tagen eine sehr nette Anwendung zum Betrachten von Fotos im Browser gesehen. Der Nachtteil bei der Anwendung war allerdings, das man vorher ein spezielles Plug-In (weder Flash noch Silverlight) installieren musste um sich das ganze zu Betrachten. Außerdem war es sehr groß … :(

    Das geht leichter und einfacher und noch viel dynamischer dachte ich mir und habe deshalb mal ein eigenes Container-Control (ImageGrid) erstellt.

    image

    Schritt 1: Ableiten von der richtigen Klasse –> Panel

       1: public class ImageGrid : Panel
       2: {
       3:     protected override Size ArrangeOverride(Size finalSize)
       4:     {
       5:         double imageWidth = (double)this.GetValue(ImageWidthProperty);
       6:         double imageHeight = (double)this.GetValue(ImageHeightProperty);
       7:         int rowsPerColumn = (int)this.GetValue(RowsPerColumnProperty);
       8:         double imageMargin = (double)this.GetValue(ImageMarginProperty);
       9:  
      10:         int currentRow = 0;
      11:         int currentColumn = 0;
      12:  
      13:         foreach (Image image in this.Children.OfType<Image>())
      14:         {
      15:             Hover3DBehavior behavior = new Hover3DBehavior();
      16:             behavior.ZHoverValue = (double)this.GetValue(ZHoverValueProperty);
      17:             behavior.Attach(image);
      18:  
      19:             if ((bool)this.GetValue(ShowShadowProperty))
      20:             {
      21:                 DropShadowEffect ds = new DropShadowEffect();
      22:                 ds.Opacity = .3;
      23:                 ds.BlurRadius = 10.0;
      24:                 ds.Direction = 0.0;
      25:                 ds.ShadowDepth = 20.0;
      26:                 image.Effect = ds;
      27:             }
      28:  
      29:             Rect rect = new Rect(
      30:                 currentColumn * (imageWidth + imageMargin),
      31:                 currentRow * (imageHeight + imageMargin),
      32:                 imageWidth,
      33:                 imageHeight);
      34:  
      35:             image.Width = imageWidth;
      36:             image.Height = imageHeight;
      37:             image.Arrange(rect);
      38:             image.InvalidateArrange();
      39:  
      40:             currentRow++;
      41:             if (currentRow >= rowsPerColumn)
      42:             {
      43:                 currentRow = 0;
      44:                 currentColumn++;
      45:             }
      46:         }
      47:  
      48:         Size newSize = new Size((currentColumn+1) * (imageWidth + imageMargin), rowsPerColumn * (imageHeight+imageMargin));
      49:  
      50:         return base.ArrangeOverride(newSize);
      51:     }
      52: }

    Schritt 2: Erweitern mit netten Eigenschaften zum Konfigurieren

       1: private const int C_DefaultRowsPerColumn = 5;
       2: private const double C_DefaultImageWidth = 160.0;
       3: private const double C_DefaultImageHeight = 120.0;
       4: private const double C_DefaultZHover = 200.0;
       5: private const bool C_DefaultShowShadow = true;
       6: private const double C_DefaultImageMargin = 8.0;
       7:  
       8: #region Images per column
       9:  
      10: public int RowsPerColumn
      11: {
      12:     get { return (int)GetValue(RowsPerColumnProperty); }
      13:     set { SetValue(RowsPerColumnProperty, value); }
      14: }
      15:  
      16: public static readonly DependencyProperty RowsPerColumnProperty =
      17:         DependencyProperty.Register("RowsPerColumn", typeof(int),
      18:         typeof(ImageGrid),
      19:         new PropertyMetadata(C_DefaultRowsPerColumn,
      20:         new PropertyChangedCallback(OnImageSizeChanged)));
      21:  
      22: #endregion
      23:  
      24: #region Image Width
      25:  
      26: public double ImageWidth
      27: {
      28:     get { return (double)GetValue(ImageWidthProperty); }
      29:     set { SetValue(ImageWidthProperty, value); }
      30: }
      31:  
      32: public static readonly DependencyProperty ImageWidthProperty =
      33:         DependencyProperty.Register("ImageWidth", typeof(double),
      34:         typeof(ImageGrid),
      35:         new PropertyMetadata(C_DefaultImageWidth,
      36:         new PropertyChangedCallback(OnImageSizeChanged)));
      37:  
      38: #endregion
      39:  
      40: #region Image Margin
      41:  
      42: public double ImageMargin
      43: {
      44:     get { return (double)GetValue(ImageMarginProperty); }
      45:     set { SetValue(ImageMarginProperty, value); }
      46: }
      47:  
      48: public static readonly DependencyProperty ImageMarginProperty =
      49:         DependencyProperty.Register("ImageMargin", typeof(double),
      50:         typeof(ImageGrid),
      51:         new PropertyMetadata(C_DefaultImageMargin,
      52:         new PropertyChangedCallback(OnImageSizeChanged)));
      53:  
      54: #endregion
      55:  
      56: #region Image Height
      57:  
      58: public double ImageHeight
      59: {
      60:     get { return (double)GetValue(ImageHeightProperty); }
      61:     set { SetValue(ImageHeightProperty, value); }
      62: }
      63:  
      64: public static readonly DependencyProperty ImageHeightProperty =
      65:         DependencyProperty.Register("ImageHeight", typeof(double),
      66:         typeof(ImageGrid),
      67:         new PropertyMetadata(C_DefaultImageHeight,
      68:         new PropertyChangedCallback(OnImageSizeChanged)));
      69:  
      70: protected static void OnImageSizeChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
      71: {
      72:     ImageGrid i = obj as ImageGrid;
      73:     i.InvalidateArrange();
      74: }
      75:  
      76: #endregion
      77:  
      78: #region ZHoverValue 
      79:  
      80: public double ZHoverValue
      81: {
      82:     get { return (double)GetValue(ZHoverValueProperty); }
      83:     set { SetValue(ZHoverValueProperty, value); }
      84: }
      85:  
      86: public static readonly DependencyProperty ZHoverValueProperty =
      87:     DependencyProperty.Register("ZHoverValue", typeof(double), typeof(ImageGrid),
      88:     new PropertyMetadata((double)C_DefaultZHover, null));
      89:  
      90: #endregion
      91:  
      92: #region Show Shadow
      93:  
      94: public bool ShowShadow
      95: {
      96:     get { return (bool)GetValue(ShowShadowProperty); }
      97:     set { SetValue(ShowShadowProperty, value); }
      98: }
      99:  
     100: public static readonly DependencyProperty ShowShadowProperty =
     101:     DependencyProperty.Register("ShowShadow", typeof(bool), typeof(ImageGrid),
     102:     new PropertyMetadata((bool)C_DefaultShowShadow, new PropertyChangedCallback(OnImageSizeChanged)));
     103:  
     104: #endregion

    Schritt 4: Erstellen eines Hover-Effektes mithilfe eines Behaviors

       1: public class Hover3DBehavior : Behavior<UIElement>
       2: {
       3:     PlaneProjection _planeProjection;
       4:  
       5:     public Hover3DBehavior()
       6:         : base()
       7:     {
       8:        
       9:     }
      10:  
      11:     Storyboard _hoverMe;
      12:     Storyboard _unhoverMe;
      13:  
      14:     private const double C_DefaultHoverValue = 500.0;
      15:  
      16:     #region ZHoverValue 
      17:  
      18:     public double ZHoverValue
      19:     {
      20:         get { return (double)GetValue(ZHoverValueProperty); }
      21:         set { SetValue(ZHoverValueProperty, value); }
      22:     }
      23:  
      24:     public static readonly DependencyProperty ZHoverValueProperty =
      25:         DependencyProperty.Register("ZHoverValue", typeof(double), typeof(Hover3DBehavior),
      26:         new PropertyMetadata((double)C_DefaultHoverValue, null));
      27:  
      28:     #endregion
      29:  
      30:     #region Overrides 
      31:  
      32:     protected override void OnAttached()
      33:     {
      34:         base.OnAttached();
      35:  
      36:         _planeProjection = new PlaneProjection();
      37:         this.AssociatedObject.Projection = _planeProjection;
      38:  
      39:         if (!DesignerProperties.GetIsInDesignMode(this))
      40:         {
      41:             _hoverMe = new Storyboard();
      42:  
      43:             DoubleAnimation da1 = new DoubleAnimation();
      44:  
      45:             _hoverMe.Children.Add(da1);
      46:             da1.Duration = new Duration(new System.TimeSpan(0, 0, 0, 0, 300));
      47:             da1.To = this.ZHoverValue;
      48:             Storyboard.SetTarget(da1, this.AssociatedObject);
      49:             Storyboard.SetTargetProperty(da1, new PropertyPath("(UIElement.Projection).(PlaneProjection.LocalOffsetZ)"));
      50:  
      51:             DoubleAnimation da2 = new DoubleAnimation();
      52:             BounceEase be2 = new BounceEase();
      53:             be2.EasingMode = EasingMode.EaseOut;
      54:             be2.Bounces = 3;
      55:             da2.EasingFunction = be2;
      56:  
      57:             _unhoverMe = new Storyboard();
      58:             _unhoverMe.Children.Add(da2);
      59:             da2.Duration = new Duration(new System.TimeSpan(0, 0, 0, 0, 1000));
      60:             da2.To = 0.0;
      61:             Storyboard.SetTarget(da2, this.AssociatedObject);
      62:             Storyboard.SetTargetProperty(da2, new PropertyPath("(UIElement.Projection).(PlaneProjection.LocalOffsetZ)"));
      63:  
      64:             if ((this.AssociatedObject as FrameworkElement).Resources.Contains("hoverme"))
      65:             {
      66:                 (this.AssociatedObject as FrameworkElement).Resources.Remove("hoverme");
      67:             }
      68:             (this.AssociatedObject as FrameworkElement).Resources.Add("hoverme", _hoverMe);
      69:             
      70:             if ((this.AssociatedObject as FrameworkElement).Resources.Contains("unhoverme"))
      71:             {
      72:                 (this.AssociatedObject as FrameworkElement).Resources.Remove("unhoverme");
      73:             }
      74:             (this.AssociatedObject as FrameworkElement).Resources.Add("unhoverme", _unhoverMe);
      75:         }
      76:         
      77:         this.AssociatedObject.MouseEnter += new MouseEventHandler(AssociatedObject_MouseEnter);
      78:         this.AssociatedObject.MouseLeave += new MouseEventHandler(AssociatedObject_MouseLeave);
      79:     }
      80:  
      81:     protected override void OnDetaching()
      82:     {
      83:         base.OnDetaching();
      84:  
      85:         this.AssociatedObject.Projection = null;
      86:         _planeProjection = null;
      87:  
      88:         this.AssociatedObject.MouseEnter -= new MouseEventHandler(AssociatedObject_MouseEnter);
      89:         this.AssociatedObject.MouseLeave -= new MouseEventHandler(AssociatedObject_MouseLeave);
      90:     }
      91:  
      92:     #endregion
      93:  
      94:     #region Events
      95:  
      96:     void AssociatedObject_MouseLeave(object sender, MouseEventArgs e)
      97:     {
      98:         _unhoverMe.Begin();
      99:     }
     100:  
     101:     void AssociatedObject_MouseEnter(object sender, MouseEventArgs e)
     102:     {
     103:         _hoverMe.Begin();
     104:     }
     105:  
     106:     #endregion
     107:  
     108: }

    Schritt 3: Verwenden in Blend

    Das ImageGrid nach dem ich einige Beispielbilder reingesetzt habe.

    image

    Der Arbeitsbereich

    image

    Der VisualTree.

     image

    Die zusätzlichen Konfigurationsmöglichkeiten.

  • o-LIVE-r

    Silverlight 3: Erstellen eigener Behaviors

    • 0 Comments

    Ein neues Feature von Silverlight sind Behaviors. Dieses Feature wurde von WPF abgeguckt. Das schöne daran ist … diese WPF Behaviors können nahezu 1:1 wieder verwendet werden. Aber mal der Reihe nach.

    Was sind Behaviors?

    Behaviors sind eine Art von Verhalten, welches man einem Element nachträglich geben kann. Mittels Blend geht dies sogar ohne Programmieren, einfach durch Drag&Drop. Das folgende Bild zeigt die neue Asset-Bibliothek in Blend 3.

    image

    Um ein Behavior auf ein Element anzuwenden, zieht man dieses einfach per Drag&Drop aus der Asset-Library auf das entsprechende Control.

    image

    Und schon hat das Control (_imageGrid) die Mouse3DBehavior-Eigenschaften.

    Anbei der Code für das Mouse3DBehavior, welches ich in meiner kleinen Bildergalerie verwende. Damit läßt sich nun jedes Control mit der Maus dreidimensional Bewegen. Einfach die linke Maustaste drücken und die Maus bewegen.

    image

    Anbei der Code für das Mouse3DBehavior.

       1: public class Mouse3DBehavior : Behavior<UIElement>
       2: {
       3: PlaneProjection _planeProjection;
       4: bool _buttonPressed = false;
       5: Point _originPoint;
       6:  
       7: protected override void OnAttached()
       8: {

     

       9:     base.OnAttached();
      10:  
      11:     _planeProjection = new PlaneProjection();
      12:     this.AssociatedObject.Projection = _planeProjection;
      13:  
      14:     (new MouseWheelHelper(this.AssociatedObject as FrameworkElement)).Moved += new System.EventHandler<MouseWheelEventArgs>(Mouse3DBehavior_Moved);
      15:  
      16:     this.AssociatedObject.MouseLeftButtonDown += new MouseButtonEventHandler(AssociatedObject_MouseLeftButtonDown);
      17:     this.AssociatedObject.MouseLeftButtonUp += new MouseButtonEventHandler(AssociatedObject_MouseLeftButtonUp);
      18:     this.AssociatedObject.MouseMove += new MouseEventHandler(AssociatedObject_MouseMove);
      19:     this.AssociatedObject.MouseLeave += new MouseEventHandler(AssociatedObject_MouseLeave);
      20:  
      21:     this.AssociatedObject.KeyUp += new KeyEventHandler(AssociatedObject_KeyUp);
      22:     this.AssociatedObject.KeyDown += new KeyEventHandler(AssociatedObject_KeyDown);
      23: }
      24:  
      25: bool _shiftPressed = false;
      26:  
      27: void AssociatedObject_KeyDown(object sender, KeyEventArgs e)
      28: {
      29:     if (e.Key == Key.Shift)
      30:     {
      31:         _shiftPressed = true;
      32:     }
      33: }
      34:  
      35: void AssociatedObject_KeyUp(object sender, KeyEventArgs e)
      36: {
      37:     _shiftPressed = false;
      38: }
      39:  
      40: void Mouse3DBehavior_Moved(object sender, MouseWheelEventArgs e)
      41: {
      42:     if (_buttonPressed)
      43:     {
      44:         _planeProjection.LocalOffsetZ += e.Delta * 10;
      45:         this.AssociatedObject.Projection = _planeProjection;
      46:     }
      47: }
      48:  
      49: void AssociatedObject_MouseLeave(object sender, MouseEventArgs e)
      50: {
      51:     _buttonPressed = false;
      52: }
      53:  
      54: void AssociatedObject_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
      55: {
      56:     _originPoint = GetPoint(e);
      57:     _buttonPressed = true;
      58: }
      59:  
      60: void AssociatedObject_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
      61: {
      62:     _buttonPressed = false;
      63: }
      64:  
      65: void AssociatedObject_MouseMove(object sender, MouseEventArgs e)
      66: {
      67:     if (_buttonPressed)
      68:     {
      69:         Point p = GetPoint(e);
      70:  
      71:         double diffX = p.X - _originPoint.X;
      72:         double diffY = p.Y - _originPoint.Y;
      73:  
      74:         _planeProjection.RotationY += diffX / 10;
      75:         _planeProjection.RotationX += diffY / 10;
      76:         this.AssociatedObject.Projection = _planeProjection;
      77:  
      78:         _originPoint = p;
      79:     }
      80: }
      81:  
      82: private Point GetPoint(MouseEventArgs e)
      83: {
      84:     return e.GetPosition(this.AssociatedObject);
      85: }
      86:  
      87: protected override void OnDetaching()
      88: {
      89:     base.OnDetaching();
      90:  
      91:     this.AssociatedObject.Projection = null;
      92:  
      93:     this.AssociatedObject.MouseLeftButtonDown -= new MouseButtonEventHandler(AssociatedObject_MouseLeftButtonDown);
      94:     this.AssociatedObject.MouseLeftButtonUp -= new MouseButtonEventHandler(AssociatedObject_MouseLeftButtonUp);
      95:     this.AssociatedObject.MouseMove -= new MouseEventHandler(AssociatedObject_MouseMove);
      96: }

    Damit das ganze funktioniert muss man noch die Microsoft.Expression.Interactivity bzw. System.Windows.Interactivity einbinden. Diese liegt in einem Unterordner von Expression bzw. dem SDK.

  • o-LIVE-r

    NRW Conf 09: Community is back!

    • 0 Comments

    Community-Event-Werbung aus der Heimat ;)

    “Am 28. August ist es wieder so weit. Die Community in Nordrhein-Westfalen gibt sich wie jedes Jahr die Ehre und veranstaltet das größte Event für Software-Entwickler, IT-Pros und dieses Jahr auch für UI-Designer.

    Buchen Sie jetzt Ihr Ticket zum Wissensvorsprung und melden Sie sich heute noch zur NRW Conf 09 und zum Workshop Day an. Nationale und internationale Speaker bringen Ihnen neueste Developer und IT-Pro Technologien näher. Profitieren auch Sie vom Networking mit anderen Gästen auf unserem gemeinsamen Flug durch die IT.

    Immer noch nicht überzeugt? Lesen sie unser Feedback vom letzten Jahr. “

  • o-LIVE-r

    Mandelbrot mit Silverlight 3

    • 0 Comments

    Basierend auf der Inspiration von http://www.eggheadcafe.com/tutorials/aspnet/05748429-75a4-449a-9aab-82758cfb13df/animating-mandelbrot-frac.aspx habe ich mich drangesetzt ein kleines Control für die Erstellung und Berechnung von Mandelbrot-Grafiken zu erzeugen. Im Gegensatz zum Original, habe ich das Control allerdings so geschrieben, das alle Parameter über Dependancy Properties in Blend konfigurierbar und animierbar sind.

    Einige Impressionen …

    image image image

    Das ganze lässt sich übrigens in prima in Blend über die Eigenschaften konfigurieren.

    image

    Der Code für das Mandelbrot-Control …

       1: using System;
       2: using System.Windows;
       3: using System.Windows.Controls;
       4: using System.Windows.Media;
       5: using System.Windows.Media.Imaging;
       6:  
       7: namespace Homepage.Fun.Mandelbrot
       8: {
       9:     public partial class MandelbrotControl : UserControl
      10:     {
      11:         public MandelbrotControl()
      12:         {
      13:             InitializeComponent();
      14:  
      15:             DrawMandelbrotSet();
      16:         }
      17:  
      18:         #region Dependancy Properties
      19:  
      20:         public double RMin 
      21:         {
      22:             get { return (double)GetValue(RMinProperty); }
      23:             set 
      24:             {
      25:                 SetValue(RMinProperty, value);
      26:                 DrawMandelbrotSet();
      27:             }
      28:         }
      29:  
      30:         public static readonly DependencyProperty RMinProperty =
      31:                 DependencyProperty.Register("RMin", typeof(double),
      32:                 typeof(MandelbrotControl),
      33:                 new PropertyMetadata(-.75,
      34:                 null));
      35:  
      36:         public double RMax
      37:         {
      38:             get { return (double)GetValue(RMaxProperty); }
      39:             set
      40:             {
      41:                 SetValue(RMaxProperty, value);
      42:                 DrawMandelbrotSet();
      43:             }
      44:         }
      45:  
      46:         public static readonly DependencyProperty RMaxProperty =
      47:                 DependencyProperty.Register("RMax", typeof(double),
      48:                 typeof(MandelbrotControl),
      49:                 new PropertyMetadata(-.46,
      50:                 null));
      51:  
      52:         public double IMin
      53:         {
      54:             get { return (double)GetValue(IMinProperty); }
      55:             set
      56:             {
      57:                 SetValue(IMinProperty, value);
      58:                 DrawMandelbrotSet();
      59:             }
      60:         }
      61:  
      62:         public static readonly DependencyProperty IMinProperty =
      63:             DependencyProperty.Register("IMin", typeof(double),
      64:             typeof(MandelbrotControl),
      65:             new PropertyMetadata(-.65,
      66:             null));
      67:  
      68:         public double IMax
      69:         {
      70:             get { return (double)GetValue(IMaxProperty); }
      71:             set
      72:             {
      73:                 SetValue(IMaxProperty, value);
      74:                 DrawMandelbrotSet();
      75:             }
      76:         }
      77:  
      78:         public static readonly DependencyProperty IMaxProperty =
      79:             DependencyProperty.Register("IMax", typeof(double),
      80:             typeof(MandelbrotControl),
      81:             new PropertyMetadata(-.50,
      82:             null));
      83:  
      84:         public int Escape
      85:         {
      86:             get { return (int)GetValue(EscapeProperty); }
      87:             set
      88:             {
      89:                 SetValue(EscapeProperty, value);
      90:                 DrawMandelbrotSet();
      91:             }
      92:         }
      93:  
      94:         public static readonly DependencyProperty EscapeProperty =
      95:                 DependencyProperty.Register("Escape", typeof(int),
      96:                 typeof(MandelbrotControl),
      97:                 new PropertyMetadata(20,
      98:                 null));
      99:  
     100:         public int Max
     101:         {
     102:             get { return (int)GetValue(MaxProperty); }
     103:             set
     104:             {
     105:                 SetValue(MaxProperty, value);
     106:                 DrawMandelbrotSet();
     107:             }
     108:         }
     109:  
     110:         public static readonly DependencyProperty MaxProperty =
     111:                 DependencyProperty.Register("Max", typeof(int),
     112:                 typeof(MandelbrotControl),
     113:                 new PropertyMetadata(30,
     114:                 null));
     115:  
     116:         public double Step
     117:         {
     118:             get { return (double)GetValue(StepProperty); }
     119:             set
     120:             {
     121:                 SetValue(StepProperty, value);
     122:                 DrawMandelbrotSet();
     123:             }
     124:         }
     125:  
     126:         public static readonly DependencyProperty StepProperty =
     127:                 DependencyProperty.Register("Step", typeof(double),
     128:                 typeof(MandelbrotControl),
     129:                 new PropertyMetadata(.002,
     130:                 null));
     131:  
     132:         public int Count
     133:         {
     134:             get { return (int)GetValue(CountProperty); }
     135:             set
     136:             {
     137:                 SetValue(CountProperty, value);
     138:                 DrawMandelbrotSet();
     139:             }
     140:         }
     141:  
     142:         public static readonly DependencyProperty CountProperty =
     143:                 DependencyProperty.Register("Count", typeof(int),
     144:                 typeof(MandelbrotControl),
     145:                 new PropertyMetadata(100,
     146:                 null));
     147:  
     148:         public int ImageWidth
     149:         {
     150:             get { return (int)GetValue(ImageWidthProperty); }
     151:             set
     152:             {
     153:                 SetValue(ImageWidthProperty, value);
     154:                 DrawMandelbrotSet();
     155:             }
     156:         }
     157:  
     158:         public static readonly DependencyProperty ImageWidthProperty =
     159:                 DependencyProperty.Register("ImageWidth", typeof(int),
     160:                 typeof(MandelbrotControl),
     161:                 new PropertyMetadata(400,
     162:                 null));
     163:  
     164:  
     165:         public int ImageHeight
     166:         {
     167:             get { return (int)GetValue(ImageHeightProperty); }
     168:             set
     169:             {
     170:                 SetValue(ImageHeightProperty, value);
     171:                 DrawMandelbrotSet();
     172:             }
     173:         }
     174:  
     175:         public static readonly DependencyProperty ImageHeightProperty =
     176:                 DependencyProperty.Register("ImageHeight", typeof(int),
     177:                 typeof(MandelbrotControl),
     178:                 new PropertyMetadata(400,
     179:                 null));
     180:  
     181:         public int PowFactor
     182:         {
     183:             get { return (int)GetValue(PowFactorProperty); }
     184:             set
     185:             {
     186:                 SetValue(PowFactorProperty, value);
     187:                 DrawMandelbrotSet();
     188:             }
     189:         }
     190:  
     191:         public static readonly DependencyProperty PowFactorProperty =
     192:                 DependencyProperty.Register("PowFactor", typeof(int),
     193:                 typeof(MandelbrotControl),
     194:                 new PropertyMetadata(5,
     195:                 null));
     196:  
     197:         public double Param1
     198:         {
     199:             get { return (double)GetValue(Param1Property); }
     200:             set
     201:             {
     202:                 SetValue(Param1Property, value);
     203:                 DrawMandelbrotSet();
     204:             }
     205:         }
     206:  
     207:         public static readonly DependencyProperty Param1Property =
     208:                 DependencyProperty.Register("Param1", typeof(double),
     209:                 typeof(MandelbrotControl),
     210:                 new PropertyMetadata(2.0,
     211:                 null));
     212:  
     213:         #endregion
     214:  
     215:         private void DrawMandelbrotSet()
     216:         {
     217:             double rmin = (double)this.GetValue(RMinProperty);
     218:             double rmax = (double)this.GetValue(RMinProperty);
     219:             double imin = (double)this.GetValue(RMinProperty);
     220:             double imax = (double)this.GetValue(RMinProperty);
     221:             
     222:             double step = (double)this.GetValue(StepProperty);
     223:             int max = (int)this.GetValue(MaxProperty);
     224:             int escape = (int)this.GetValue(EscapeProperty);
     225:  
     226:             int width = (int)GetValue(ImageWidthProperty);
     227:             int height = (int)GetValue(ImageHeightProperty);
     228:             int powFactor = (int)GetValue(PowFactorProperty);
     229:             int count = (int)this.GetValue(CountProperty);
     230:  
     231:             double param1 = (double)GetValue(Param1Property);
     232:  
     233:             rmin -= step * count;
     234:             rmax += step * count;
     235:             imin -= step * count;
     236:             imax += step * count;
     237:  
     238:             WriteableBitmap bitmap = new WriteableBitmap(width, height, PixelFormats.Bgr32);
     239:  
     240:             double dr = (rmax - rmin) / (width - 1);
     241:             double di = (imax - imin) / (height - 1);
     242:  
     243:             for (int x = 0; x < width; x++)
     244:             {
     245:                 double cr = rmin + (x * dr);
     246:                 for (int y = 0; y < height; y++)
     247:                 {
     248:                     double ci = imin + (y * di);
     249:                     double zr = cr;
     250:                     double zi = ci;
     251:                     int counter = 0;
     252:  
     253:                     while (counter < max)
     254:                     {
     255:                         double zr2 = zr * zr;
     256:                         double zi2 = zi * zi;
     257:  
     258:                         if (zr2 + zi2 > escape)
     259:                         {
     260:                             bitmap.Pixels[(y * width) + x] = (int)Math.Pow(counter + 1, powFactor) % int.MaxValue;
     261:                             break;
     262:                         }
     263:                         zi = ci + (param1 * zr * zi);
     264:                         zr = cr + zr2 - zi2;
     265:                         counter++;
     266:                     }
     267:  
     268:                     if (counter == max)
     269:                     {
     270:                         bitmap.Pixels[(y * width) + x] = 0; // Black
     271:                     }
     272:                 }
     273:             }
     274:  
     275:             _image.Source = bitmap;
     276:         }
     277:     }
     278: }
  • o-LIVE-r

    Vergleich von WPF- und Silverlight-Entwicklungen

    • 0 Comments

    Auf Codeplex haben einige meiner Kollegen ein Dokument bereit gestellt, das die Gemeinsamkeiten und Unterschiede von WPF und Silverlightbeschreiben.

    Sehr lesenswert: Microsoft WPF-Silverlight Comparison Whitepaper

  • o-LIVE-r

    Silverlight Anwendungen ausspionieren mit SilverlightSpy

    • 0 Comments

    Ich bin vor einigen Tagen über dieses (sehr geniale) Tool gestolpert.

    Silverlight Spy

    image

    Mit diesem “Spion” kann man Silverlight Anwendungen komplett analysieren und auskundschaften.

    Sehr leicht via ClickOnce installierbar von hier: http://silverlightspy.com/silverlightspy/download-silverlight-spy/

  • o-LIVE-r

    Silverlight Photo Explorer 1.0 mit PHP

    • 0 Comments

    Eine der interessantesten Silverlight-Blogs der letzten Zeit ist diese: www.shinedraw.com .

    Dort werden sehr interessante und typische Flash-Elemente in direkten Vergleich zu Silverlight entwickelt und gegenübergestellt. Inklusive Sourcecode.

    Neuestes Schmankerl ist ein Explorer-like-Control zur Darstellung von einem Bilderverzeichnis inkl. Unterverzeichnisses auf einem Server mit Hilfe von Silverlight und PHP.

    image

    Mehr Infos: http://www.shinedraw.com/data-handling/silverlight-photo-explorer-10/

  • o-LIVE-r

    MSDN bietet nun erstmals Webcasts exklusiv für Heise-Leser an

    • 0 Comments

    Eine Auswahl von MSDN-Webcasts wird nun für einen gewissen Zeitraum exklusiv über den Developer-Channel auf Heise.de zur Verfügung gestellt. Im Klartext bedeutet dies, dass Heise-Leser auf die ausgewählten Webcasts bereits 2 Wochen vor dem Release auf dem MSDN Portal zugreifen können. Damit wird die gute Zusammenarbeit zwischen Heise und MSDN ein weiteres Mal unterstrichen. Den Anfang dieses Projektes bildet die 5tlg. Webcast-Serie von Patrick A. Lorenz zur Pragmatischen Webarchitektur mit ASP.Net 3.5. Zu den ersten beiden Teilen sind auf Heise auch bereits die News veröffentlicht worden:

    http://www.heise.de/developer/MSDN-Webcast-zur-pragmatischen-Web-Architektur-mit-ASP-NET-3-5--/news/meldung/140148

    http://www.heise.de/developer/MSDN-Webcast-zur-Web-Architektur-mit-ASP-NET-3-5-Teil-2--/news/meldung/140387

Page 1 of 2 (32 items) 12