Silverlight Give me five! (Teil 3)
Kommentare

„P/Invoke“-Unterstützung
Während für vertrauenswürdige Anwendungen in der vierten Version bereits COM-Interop möglich war, sind in der neuen Version auch die aus dem .NET Framework bekannten Plattformaufrufe

„P/Invoke“-Unterstützung

Während für vertrauenswürdige Anwendungen in der vierten Version bereits COM-Interop möglich war, sind in der neuen Version auch die aus dem .NET Framework bekannten Plattformaufrufe vorhanden: P/Invoke. Die Funktionsweise in Silverlight entspricht jener aus dem .NET Framework. Es wird eine Methodensignatur deklariert und mit dem extern-Schlüsselwort ausgestattet. Mit dem DllImport-Attribut wird angegeben, in welcher nativen DLL sich die Methodenimplementierung zur angegebenen Methodensignatur befindet. In Listing 7 wird die LockWorkStation-Methode aus der user32.dll deklariert. In einer vertrauenswürdigen Anwendung lässt sich durch Aufruf dieser Methode der Rechner sperren. Im oberen Button_Click Event Handler geschieht das nach einer Prüfung, ob die Anwendung überhaupt vertrauenswürdig abläuft.

Listing 7
private void Button_Click(object sender, RoutedEventArgs e)
{
    if (Application.Current.HasElevatedPermissions)
    {
        LockWorkStation();
    }
}
[DllImport("user32.dll")]
public static extern void LockWorkStation();
  

Native Fenster

Für vertrauenswürdige Anwendungen außerhalb des Browsers lassen sich mit Silverlight 5 native Fenster aufrufen. Diese Funktionalität ist nur in Out-of-Browser-Anwendungen verfügbar. Native Fenster sind insbesondere dann nützlich, wenn die Silverlight-Applikation auf mehreren Bildschirmen genutzt wird. So kann zum Beispiel ein aus der Anwendung geöffnetes Fenster auf den zweiten Bildschirm geschoben werden. Zur Unterstützung von nativen Fenstern gibt es in Silverlight 5 die Window-Klasse (Namespace: System.Windows). Sie besitzt eine Content Property vom Typ FrameworkElement. Das ihr zugewiesene Element wird im Fenster angezeigt. Üblicherweise wird ein UserControl erstellt, das dann der Content Property eines dynamisch erzeugten Window-Objekts zugewiesen werden kann. In Listing 7 wird zur Einfachheit lediglich ein TextBlock-Element zugewiesen. Die Window-Klasse besitzt weitere typische Fenster-Properties wie WindowState oder WindowStyle, eine Close-Methode und natürlich ein Closing Event, dessen EventArgs das Abbrechen des Schließvorgangs ermöglichen.

Listing 8
private void Button_Click(object sender, RoutedEventArgs e)
{
  var win = new Window();
  win.Title = "Natives Fenster";
  win.Content = new TextBlock { Text = "Hello" };
  win.Show();
}
  

Doppelklick

Ein kleineres, aber durchaus nützliches Feature ist die ClickCount Property der MouseButtonEventArgs. Damit lässt sich in einem MouseLeftButtonDown Event Handler einfach prüfen, ob beispielsweise ein Doppelklick stattgefunden hat. Während das in in der vierten Version durch Speichern der Click-Zeit auch möglich war, ist der Weg nun deutlich einfacher, wie Listing 9 zeigt.

Listing 9
private void Image_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
  if (e.ClickCount == 2)
  {
    MessageBox.Show("Doppelklick ausgeführt");
  }
}
  

Das PivotViewer-Element

Das neue Element PivotViewer erlaubt es dem Benutzer, relationale Daten dynamisch zu sortieren und zu kategorisieren. Das Schöne am PivotViewer ist es, dass die Daten mit DataTemplates ein entsprechendes Aussehen erhalten. Mit Animationen werden einzelne Teile dynamisch und sehr flüssig angeordnet. Um einen ersten Blick auf das Element zu werfen, eignet sich eine sehr einfache Collection mit einfachen Objekten. Im folgenden kleinen Beispiel werden Person-Objekte genutzt, die lediglich die drei Properties FirstName, LastName und Birthday besitzen (Listing 10). In XAML wird das PivotViewer-Element hinzugefügt. Eine Referenz auf die Assembly System.Windows.Controls.Pivot und ein entsprechendes Namespace Mapping in XAML ist zum Verwenden notwendig. Am besten das Element zur Toolbox hinzufügen und daraus in das XAML-Codefenster droppen, dann passiert beides automatisch. Das PivotViewer-Element besitzt die PivotProperties-Eigenschaft, mit der sich einstellen lässt, nach welchen Attributen zum Beispiel gefiltert werden kann. Darüber hinaus gibt es die ItemTemplates Property, die PivotViewerItemTemplate-Objekte entgegennimmt, mit denen dann die Daten dargestellt werden. Listing 11 zeigt ein vollständiges PivotViewer-Element in XAML zum Darstellen der Personen. Um das PivotViewer-Element mit Daten zu füttern, wird der ItemsSource Property eine Collection zugewiesen (Listing 12). Nach dem Starten der Anwendung zeigt der PivotViewer die in der ItemsSource Property enthaltenen Elemente an (Abb. 5). Auf der linken Seite kann nach Vorname, Nachname und Geburtstag gefiltert werden. Die Elemente, die im Hauptbereich mit dem in Listing 11 erstellten PivotViewerItemTemplate dargestellt werden, sortieren sich beim Filtern mit einer schönen Animation entsprechend neu. In Abbildung 6 wurde auf der oberen Seite des PivotViewer nach Nachname sortiert und ausgewählt, dass die Elemente in Silos nebeneinander dargestellt werden. „Hubers“ haben in der Collection nun Überzahl.

Listing 10
public class Person
{
  public Person()    {    }
  public Person(string firstName,string lastName, DateTime birthDay)
  {
    FirstName = firstName;
    LastName = lastName;
    Birthday = birthDay;
  }
  public string FirstName { get; set; }
  public string LastName { get; set; }
  public DateTime Birthday { get; set; }
}
  

Listing 11

  
    
    
    
  
  
    
      
        
          
          
        
      
    
  

  

Listing 12
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
  var persons = new List();
  persons.Add(new Person("Thomas", "Huber", new DateTime(1980, 10, 28)));
  persons.Add(new Person("Julia", "Huber", new DateTime(1982, 8, 6)));
  persons.Add(new Person("Melanie", "Huber", new DateTime(1977, 6, 17)));
  ...
  pivotViewer.ItemsSource = persons;
}
  

Abb. 5: PivotViewer ungefiltert
Abb. 5: PivotViewer ungefiltert

Abb. 6: PivotViewer nach Nachname sortiert
Abb. 6: PivotViewer nach Nachname sortiert

Fazit

Silverlight 5 enthält zahlreiche und vielversprechende Neuerungen. In diesem Artikel wurden einige der Topfeatures vorgestellt. Allerdings sind das bei Weitem nicht alle Neuerungen. Es gibt viele weitere Features, die vielleicht subjektiv vom einzelnen Entwickler betrachtet auch ein „Topfeature“ darstellen können. Beispielsweise unterstützt das Data Binding jetzt auch den RelativeSource-Modus FindAncestor, was insbesondere beim MVVM-Pattern nützlich ist, um aus einem DataTemplate an das ViewModel-Objekt zu binden. Neu gibt es auch ein DataContextChanged-Event und Unterstützung für 64bit. Microsoft hat mit Silverlight 5 einen großen Wurf hingelegt. Die Zukunft wird zeigen, wie sich die fünfte Version im Businessumfeld bewähren wird.

Thomas Claudius Huber ist Senior Consultant bei der Trivadis AG in Basel. Er überarbeitet gerade sein Buch zu Silverlight 4 und bestückt es mit den Neuerungen, welche Silverlight 5 bringt. Kritik und Anregungen nimmt er gerne entgegen: thomas[at]thomasclaudiushuber.com.
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -