www.planet-xaml.net
  •  

    XAML

    • [XAML]

      XAML - in Zukunft überall!

      by Florian Krüsch, October 24, 2008

      Schade, zur PDC reicht es bei mir dieses Jahr nicht. Trotzdem lohnt natürlich ein Blick auf die Agenda. Eine Session ist mir besonders aufgefallen: Microsoft .NET Framework: Declarative Programming Using XAML (TL36). Inhalt:

      If you're using Windows Presentation Foundation (WPF), Windows Communication Foundation (WCF), or Windows Workflow Foundation (WF), then XAML is your new best friend! Learn how an entire application-from presentation to data to services to workflow--can be authored using simple, declarative XAML notations introduced in the next version of the .NET Framework. Learn about XAML additions like: support for generics, object references, non-default constructors, and more.

      Ich verstehe das so, dass XAML in Zukunft überall im .NET Framework Einzug halten wird, also neben WPF und WF auch in WCF und Datenmodellierung. Klar, XAML steht ja auch für eXtensible Application Markup Language und nicht für eXtensible UI Markup Language.

      Auch gibt es zwischen der XML Konfiguration für IoC Container wie Spring oder Castle Windsor und XAML gewisse Parallelen, in beiden Fällen werden letztendlich Objektbäume und Abhängigkeiten über XML zusammengestöpselt. XAML wird in Zukunft also immer wichtiger werden und das ist auch gut so.


      no comments
    •  ^
    • [XAMLWPF]

      Binding Position Data to an ItemsHost for Layout

      by Florian Krüsch, July 21, 2008

      Edit: Actually Dr.WPF already showed what I was trying to explain here at the end of this post.

      Dr.WPF has added another awesome episode to his continuing ItemsControl saga.

      In the Bonus section he explains how to bind to the ItemContainer from within the ItemTemplate. This reminded me of something... from time to time I ran into the need for exactly the opposite thing: binding to the Item itself from within the ItemContainer.

      The scenario I'm talking about is when the list item contains some kind of position information and you want that to influence the ItemContainer's layout position within the ItemsHost.

      That is, you want a ListBoxItem to show at a position that comes from the object it displays.

      Here's a simple solution:

      Sample data:
      C#toggle
      theListBox.ItemsSource = new[]
      {
          new { Title = 
      "Hello", Pos = new Point(200,30) },
          new { Title = 
      "World", Pos = new Point(100,60) }
      };

      XAML:
      XAMLtoggle
      <ListBox x:Name="theListBox" Width="240" Height="300" Background="Black">
          
          
      <ListBox.ItemTemplate>
              
      <DataTemplate>
                  
      <TextBlock Text="{Binding Title}" Background="Pink" />
              
      </DataTemplate>
          
      </ListBox.ItemTemplate>
          
          
      <ListBox.ItemsPanel>
              
      <ItemsPanelTemplate>
                  
      <Canvas />
              
      </ItemsPanelTemplate>
          
      </ListBox.ItemsPanel>
          
          
      <ListBox.ItemContainerStyle>
              
      <Style>
                  
      <Setter Property="Canvas.Left" Value="{Binding Pos.X}" />
                  
      <Setter Property="Canvas.Top" Value="{Binding Pos.Y}" />
              
      </Style>
          
      </ListBox.ItemContainerStyle>
      </
      ListBox>

      Cheers,
      Florian


      no comments
    •  ^
    • Congratulations, Josh, to your 50th article on the Codeproject... that's quite impressive indeed!

      I do think, however, there is a much simpler solution in this case, which is truely along the WPF way of things without hackery.

      Accessing stuff inside Resource Dictionaries from within a ValueConverter is something I stumbled upon over and over again in XAML. My solution is a combination of MultiBinding and an IMultiConverter. The first Binding resembles the original binding. The second Binding binds to the FrameworkElement that provides the Resource Dictionary scope for the resource.

      In this case, I've added the type of the enum as a ConverterParameter for a generic solution:

      This is how the Binding looks like:

      XAMLtoggle
      <ItemsControl x:Name="_personList">
        
      <ItemsControl.ItemTemplate>
          
      <MultiBinding 
           
      Converter="{StaticResource EnumTypeKeyResourceConverter}" 
           
      ConverterParameter="{x:Type local:DisplayDetailLevel}"
          
      >
            
      <Binding Path="Value" ElementName="_detailLevelSlider" />
            
      <Binding ElementName="_personList" />                        
          
      </MultiBinding>             
        
      </ItemsControl.ItemTemplate>
      </
      ItemsControl>

      The code for the ValueConverter is a little bit more, mostly because of the generic number and enum conversion stuff:

      C#toggle
      public class EnumTypeKeyResourceConverter 
          : IMultiValueConverter
        {
          public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
          {
            if (values.Length < 2) 
                  return Binding.DoNothing;

            Object value = values[0];
            var scope = values[1] as FrameworkElement;
            var enumType = parameter as Type;

            if (scope == null || enumType == null)
                  return Binding.DoNothing;

            if (!enumType.IsEnum)
                  return Binding.DoNothing;
                  
            
      // Parse number

            Double d;
            if (!Double.TryParse(System.Convert.ToString(value), out d))
                  return Binding.DoNothing;

            
      // to int.. 
            Int32 n = System.Convert.ToInt32(Math.Round(d));

            
      // to enum
            if ((!Enum.IsDefined(enumType, n)))
                  return Binding.DoNothing;

            var key = Enum.ToObject(enumType, n);
            Object resource = scope.TryFindResource(key);

            return resource == null ? Binding.DoNothing : resource;
          }

          public object[] ConvertBack(object value, 
                                      Type[] targetTypes, 
                                      object parameter,
                                      CultureInfo culture)
          {
              throw new NotImplementedException();
          }
      }

      Cheers,
      Florian


      no comments
    •  ^
    • [WPFBlendXAML]

      WPF Projekte strukturieren: Resourcen

      by Florian Krüsch, June 27, 2008

      Eine Frage, die mir immer wieder gestellt wird ist, "Wie strukturiert man größere WPF Projekte?". Diese Frage muss man zunächst mal eingrenzen - geht es um die Architektur (Programmstruktur) oder um die Strukturierung der WPF spezifischen Assets (Controls, Styles, Bilder etc). Das ist eine Frage, die vor allem auch für Designer relevant ist.

      Architektur

      Die Frage nach der Architektur lässt sich sicher nicht ad-hoc beantworten. Es gibt Referenz-Architekturen wie Composite WPF (Prism) für Composite Smart Clients (Business Anwendungen, die sich aus verschiedenen unabhängigen Teilen zusammensetzen) oder Entwurfsmuster wie MVC und M-V-VM, die Ihre Stärken und Schwächen haben.

      Wie auch immer die Architektur im Detail aussieht, man sollte in der Präsentationsschicht die Stärken von WPF (DataBinding, Templates)nutzen und nicht dagegen arbeiten.

      Design Resourcen

      Die Strukturierung von Design-Resourcen dagegen ist eine Sache, die man sehr gut verallgemeinern kann. Die Struktur, die ich immer wieder erfolgreich für Projekte einsetze, basiert im Großen und Ganzen auf Paul Stovell's exzellenten XAML and WPF Coding Guidelines.
      Ich will hier nicht den Inhalt des Artikels wiedergeben, sondern auf die Dinge eingehen, die ich ein bischen anders mache:

      Resource-DLLs: wir packen i.d. Regel alle Resourcen in ein eigenes Projekt/DLL. Das hat den Vorteil, daß der Designer zum Testen ein eigenes, separates Projekt nutzen kann, das wie die eigentliche Anwendung die Resource-DLL einbindet.

      StaticResources: es stimmt, daß StaticResources eine Performance Verbesserung bringen. Andererseits wird damit die Reihenfolge, in der Resource Dictionaries eingebunden werden, auf einmal kritisch. Blend kommt damit oft nicht gut klar. Ich rate mittlerweile dazu, erst kurz vor Schluss von DynamicResource auf StaticResource umzustellen.

      Namenskonventionen:

      • Die PART_ Konvention ist nur für Teile (Parts) von Control Templates gedacht.
      • Für andere Namen (nicht zu verwechseln mit Resource-Keys) wählt man besser die selben Bezeichner, die man auch in C# benutzen würde und verwendet das x:Name Attribut zusammen mit x:FieldModifier.

      Resource Dictionaries: Was in Flash die Bibliothek ist, sind in WPF und Silverlight die Resource Dictionaries.
      Ich halte es für eine gute Idee, Resource Keys zu verwenden, die mit dem Filesystem übereinstimmen.
      Z.B. x:Key="Shared/Brushes/Background" Entsprechend würde ich die Datei dann auch Brushes.xaml statt BrushResources.xaml nennen.

      Wie bei der Implementierung selbst auch, ist die Bezeichnung von Resourcen eine sehr wichtige Sache und es zahlt sich aus, dabei sorgfältig vorzugehen.
      Ich würde bei der Namen-Wahl immer vom Verwendungszweck ausgehen:
      Z.B. statt
      x:Key="Brush_TransparentBlue
      besser:
      x:Key="Shared/Brushes/DialogButtonBackground


      Es ist sicher nicht immer einfach, so einen systematischen Aufbau im Team durchzusetzen und aufrecht zu erhalten, aber spätestens in der Wartungsphase oder nach dem Urlaub wird es sich auszahlen.

      Viel Spass,
      Florian


      no comments
    •  ^
    • [WPFXAML]

      .NET 3.5sp1 - der "Real Deal" für WPF

      by Florian Krüsch, May 14, 2008

      Wie die Zeit vergeht - es ist bereits vier Jahre her, daß ich mich mit den ersten Avalon CTPs herumgeschlagen habe. ["Avalon" war der Codename für die Windows Presentation Foundation]. Eine hardwarebeschleunigte Grafikplattform, die 3D, Video, Vektorgrafik, Controls und vieles mehr in sich vereint, war damals ein Versprechen, dem ich mich nicht entziehen konnte. Zumal ich gerade von Flash auf ASP.NET umgesattelt hatte, was wohl irgendwie mit dem Älterwerden zu tun hatte.

      In einem Channel 9 Interview erklärte Karsten Januszewski, auf die Frage was denn das besondere an WPF sei: "If you can think it up, you can probably pull it off." Was wohl soviel heißen sollte, wie "Jedes Userinterface, das Du Dir vorstellen kannst, kannst Du mit WPF wahrscheinlich irgendwie umsetzen".

      Ich habe dann im Folgenden an einigen wirklich ambitionierten WPF Projekten mitwirken dürfen, wie z.B. dem OTTO Vista Store, einer Anwendung für TV Responsemessung und einer Software-plus-Service artigen Consumer Anwendung für die Massen. Diese Anwendungen basierten alle auf .NET 3.0 und damit auf der ersten Version von WPF.

      Einige meiner hohen Erwartungen haben sich tatsächlich erfüllt, mit WPF konnte ich ein Listbox Control zu einem 3D-Kartenstapel umbauen, 3D Visualisierung auf Videos legen usw. aber es sind auch ein paar Wünsche offen geblieben und es gibt Dinge die sich mit der ersten Version noch nicht wirklich gut umsetzen ließen:

      • Interaktive Controls auf 3D Flächen
      • Videos mit Alphakanal
      • Interaktion mit HTML Content
      • schnelles Bitmap-Drawing
      • Aus-Blurren von Elementen im Hintergrund
      • ein Office Ribbon als Menü
      • hardwarebeschleunigtes 3D in transparenten Fenstern

      All diesen Anforderungen bin ich tatsächlich begegnet und alle sind mit .NET 3.5 und jetzt mit dem Service Pack umgesetzt bzw. richtig einfach geworden!

      Ein allgemeiner Punkt war auch immer wieder die Performance, die einfach "noch nicht ganz da" war, einfaches Deployment für Windows XP und viele Kleinigkeiten, wie z.B. Databinding von Alternating Rows oder String-Formattierungen. Alles fertig und gefixt!

      Ich bin wirklich begeistert und freue mich trotz all der Aufregung um Silverlight und Live Mesh wieder richtig auf mein nächstes WPF-Projekt.

      Weiterführende Links sind bei Rob Relyea zu finden. Ich hatte auf der MIX'08 seinen Vortrag über die kommenden Verbesserungen in WPF gesehen. Er hat fleissig alle Anregungen aus dem Publikum notiert. Vielleicht werden die geäußerten Featurerequests dann in WPF v4 integriert.

      Have fun,
      Florian


      no comments
    •  ^
     

Language | Sprache

All[e]  |  english  |  deutsch
Tags
 

Profile

Florian Kruesch

I am working as a freelance software architect, developer and consultant in Düsseldorf, Germany.

My focus is on Microsoft technologies and .NET 3.0, especially WPF, ASP.net and SQL Server.

I've been a lead programmer on the WPF development of the OTTO Vista Store at SinnerSchrader Studios.

My client list includes DHL, LG and Ogilvy Interactive.