VCR.NET goes Silverlight?

Nein, nicht wirklich. Aber da ich mich in Silverlight 4 einarbeiten wollte, um einige Konzepte zu verstehen, habe ich mir als lebendes Beispiel VCR.NET ausgesucht. Nutzbar ist das Ergebnis wohl nur in einem sehr engen Rahmen, da es wirklich nur eine technische Studie vor dem Hintergrund eines knappen Zeitbudgets ist. Aber wer mal reinschauen möchte, kann sich die beiden Dateien von hier in sein VCR.NET Installationsverzeichnis kopieren, der Aufruf erfolgt mittels http://localhost/VCR.NET/Silverlight.html – Silverlight 4 muss natürlich lokal installiert sein. Die Quellen sind wie gewohnt öffentlich verfügbar. Die Nutzung erfolgt ohne Gewähr, ich hatte keine Zeit, alle technischen VCR.NET Aspekte bis auf’s Letzte zu prüfen – ich werde den Client jetzt mal für das nutzen, was er kann und evtl. einen Update nachschieben. Die Studie versteht sich als solche und wird nicht Teil der nächsten VCR.NET Version sein.

Hier einfach so ein paar Aspekte des Clients in bunt gewürfelter Reihenfolge – Silverlight, VCR.NET, Technik, …

  • * Ein definiertes Ziel war es, im Oberflächenbereich soviel wie möglich auf XAML zu setzen und so wenig wie möglich Code zu schreiben. Das ist nur zum Teil gelungen, da vor allem die Programmzeitschrift doch einiges an Logik erfordert.
  • * Als nützlich hat sich die gemischte Nutzung von vordefinierten (App.xaml) und programmatischen (App.Resources) Ressourcen erwiesen. Es scheint allerdings etwas kniffeliger zu sein, letztere in der Startphase zur Nutzung in XAML zur Verfügung zu stellen
  • * Bei den Einstellungen habe ich ein wenig mit den Formularmöglichkeiten herumgespielt, etwa mit der Validierungsinfrastruktur oder dem praktischen Label Control.
  • * Grundsätzlich sollte alles für eine einfache Übersetzung in andere Sprachen (Lokalisierung) vorbereitet sein.
  • * Auf Deployment Techniken wie Bibliotheken bin ich bewußt nicht eingegangen.
  • * Einer der zwei wichtigen Aspekte der Studie ist die Programmzeitschrift mit ihren Filtermöglichkeiten. Hier gab es einige Ärgernisse von Silverlight vs. WPF zu ignorieren (in einer ComboBox kann man ohne weiteren Code nicht über Tasteneingaben auswählen) oder zu umgehen (die Gruppierung der Ergebnisliste nach Tag und Stunde – Gruppierungen kennt in Silverlight erst einmal nur das DataGrid). Ganz nett war es zu sehen, wie einfach man aus einem ItemsControl eine Art ListBox machen kann, die ein Auswahlfeedback bietet.
  • * Die Liste der geplanten Aufzeichnungen ist eher langweilig, hier habe ich ein bißchen mit dem DataGrid experimentiert. Ganz interessant ist die Detailanzeige von Mehrkanalaufzeichnungen, die sich auf die Ausawhl einer Aufzeichnung öffnet. Hier sind man genau, welche anderen Aufzeichnungen verhindert oder parallel aufgezeichnet werden.
  • * Meine erste Aktion war der Navigationsknopf zum Blättern, der optisch ein wenig (nicht mehr) hermachen sollte. Er blendet sich auch fast vollständig aus, wenn die Maus nicht gerade auf ihm steht.
  • * Die Animation beim Blättern ist ein reiner Test – vermutlich in der Praxis eher nervig.
  • * Es werden auch die laufenden Aufzeichnungen angezeigt. Hier war aber die Zeit zu Ende und außer genau der Anzeige kann man nicht viel machen.
  • * Im XAML wird an vielen Stellen mit Konvertern (IValueConverter) gearbeitet, vor allem zur Anzeige von Uhrzeiten (VCR.NET verwendet grundsätzlich GMT / UTC und nicht die lokale Zeitzone) oder der Auswahl von Symbolen. Richtig eingesetzt sind Konverter trotz einfachster Codierung offenbar eine starke Waffe zur Unterstützung der Dynamik – man siehe auch diesen Artikel.
  • * Die Trennung zwischen Layout und Inhalt ist sicher noch unzureichend. Zwar habe ich viel auf Styles gesetzt, aber enthalten diese dann doch zum Teil wieder Bezüge zu ihrer Umgebung – unschön, das geht sicher auch professioneller.
  • * Beim Anbindung des SOAP Web Services vom VCR.NET hat es sich als nützlich erwiesen, dass alle generierten Klassen partial sind. So konnte etwa das EPGEvent so erweitert werden, dass neu hinzugefügte Eigenschaften direkt in XAML Bindings referenzierbar sind.

Ok, das war sicher nicht alles, muss aber für jetzt reichen!

Viel Spaß

Jochen

Silverlight ListBox mit kontextabhängigem ItemTemplate

In einer ListBox von Silverlight 4 sollen .NET Objekte dargestellt werden, die zwar einer gemeinsamen Basisklasse angehören, individuell aber unterschiedliche Ausprägungen haben – im Beispiel habe ich mal eine abstrakte Basisklasse Animal (Tier) genommen und davon Insect (Insekten), Mammal (Säugetiere) und Bird (Vögel) abgeleitet. Im realen Leben soll die ListBox für die unterschiedlichen konkreten Klassen völlig unterschiedliche Darstellungen verwenden. Im Beispiel habe ich hier einfach mal einen Präfix und eine Farbunterlegung verwendet.

Beispiel

Links sieht man die normale Darstellung und rechts so, wie ich mir das vorstelle. Den gesamten Quellcode für das Beispiel habe ich hier bereitgestellt, hier nur kurz die wesentlichen Tricks (wenn es einfacher geht, wäre ich durchaus an einem Hinweis interessiert).

Die rechte ListBox verwendet ein ItemTemplate / DataTemplate, in dem eine dynamische Bindung des Styles an ein ContentControl vorgenommen wird.

<ListBox.ItemTemplate>
<DataTemplate>
<ContentControl Style="{Binding Converter={StaticResource style}}" />
</DataTemplate>
</ListBox.ItemTemplate>

Bei der statischen Ressource handelt es sich um einen IValueConverter, der nach einer Namenskonvention beliebigen Instanzen von .NET Objekten eine statische XAML Ressource zuordnet.

<app:StyleChooser x:Key="style" />

object IValueConverter.Convert( object value, Type targetType, object parameter, CultureInfo culture )
{
if (value == null)
return null;
else if (targetType == typeof( Style ))
return App.Current.Resources[value.GetType().Name + "ClassStyle"];
else
return null;
}

Nun muss nur noch für jede Klasse ein Style in der verwendete Namenskonvention bereitgestellt werden. Da hier ein ContentControl verwendet wird, hat man im ControlTemplate alle Möglichkeiten, die auch ein DataTemplate bietet.

<Style x:Key="MammalClassStyle" TargetType="ContentControl">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<StackPanel Background="Gray" Orientation="Horizontal">
<TextBlock Text="Das ist ein Säugetier: " />
<TextBlock Text="{Binding}" />
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

Happy Coding

Jochen

So was tut man doch nicht …

… ja, ich weiss. Nach einer Prüfung in Compilerbau und dem theoretischen Hintergrund von Sprachkonzepten wie LALR / LR / …, nach Arbeiten mit bison / flex / yacc / … und Schnuppern in dem Gold Parser darf man eigentlich keinen Parser mit rekursivem Abstieg von Hand programmieren. Hab‘ ich aber trotzdem mal getan – den Hintergrund dieser Entscheidung überspringe ich erst einmal, auf Wunsch kann ich das ja nachholen.

Konkret geht es um die SQL-2003 Syntax und dabei um die Suchsprache oder noch konkreter das SELECT Statement. Ich habe mich dabei hieran gehalten und hoffe einmal, dass die Beschreibung ausreichend nahe an der Wahrheit ist – verglichen mit dem, was ich vom SQL Server und Oracle weiss, sieht es zumindest mal nicht schlecht aus. In einer ersten Stufe ist ein rein syntaktischer Parser entstanden, den ich gerade in den Abschlusstest nehme. Es gibt eine Reihe von Problemen verschiedenster Art, aber zumindest scheint es im Großen und Ganzen zu laufen.

Nun, falls jemanden dies an sich (oder die Parser Bibliothek darunter) interessieren sollte: ich habe die aktuelle Version mal mit einem kleinen Installationsprogramm versehen und zum Download bereitgestellt – ich gehe davon aus, dass es in den nächsten Wochen durch meine eigenen Tests zu Updates kommt und ich werde versuchen, dies in der Versionsnummer zu berücksichtigen. Wenn die Syntax ausreichend korrekt erkannt wird, werde ich mal nach der Semantik schauen (e.g. a || b geht nur, wenn a und b Zeichenketten oder Listen sind, nicht aber für Zahlen). Vor allem die Anbindung an ein Schema wird interessant.

Für das reine Schnuppern (Auslachen? Hm…) habe ich auch die Quellen Online bereitgestellt – identisch, wie sie auch lokal installiert würden.

Für die Erstellung der Bibliotheken wurde Visual Studio / C# 2010 verwendet, allerdings gebunden an das .NET Framework 3.5 SP1 – und nicht 4.0.

Viel Spaß

Jochen

Und immer wieder params [] …

Da ich Troll nun schon wieder einmal darauf hereingefallen bin, einfach mal als kleiner Tipp für andere, die auch so vergesslich sind wie ich.

Ich verwende in C# eine Methode der Art void Test(params sometype[] args). So in C++ Analogie (sehr weit hergeholt, da das … / varargs doch nur mit Hilfe weiterer Parameter funktioniert) sollte man erst einmal erwarten, dass args niemals null ist – höchstens mal leer. Das stimmt leider nicht: C# erlaubt es auch ein sometype[] Feld direkt zu übergeben – das params wird dann mehr oder weniger ignoriert. So ein Feld kann natürlich null sein – mit der Konsequenz, dass auch args null ist!

Also Vorsicht: statt args.Length zu prüfen lieber (args == null) ? 0 : args.Length verwenden.

Viel Spaß mit all den anderen Fallstricken

Jochen

DVB.NET 3.9 Service Pack 2 Beta

Leider ist es mir noch immer nicht gelungen, die Zeit für eine nächste Version 4.0 zusammen zu kratzen. Da es aber inzwischen einige kleinere Erweiterungen (primär für Entwickler) und zumindest einen echten Fix gibt, bin ich dabei, ein zweites Service Pack für die aktuellen Version zusammen zu stellen. Das ist aber noch in der Testphase.

Bei der Umstellung auf Visual Studio 2010 hatte ich dabei ein interessantes (ärgerliches?) Problem, dass ich bisher noch nicht verstanden (nachrecherchiert) habe: bei der Konvertierung der Setup (MSI) Projekte wurden für viele Komponenten neue Kennungen (ComponentId) vergeben. Diese sind bisher auch nach Neuübersetzen mit vorherigem Löschen der MSI immer gleich geblieben. Das hatte ich ausgenutzt, damit die Installationspakete sich gegenseitig erkennen und als Installationsvoraussetzung nutzen können. Durch die Änderung musste ich alle Pakete in den SP2 mit aufnehmen, auch VCR.NET und den Viewer, die sich gar nicht verändert haben.

Trotz Allem viel Spaß beim Testen

Jochen