Eine kleine Formalität vorweg: Mitte Juni entschied man sich bei Microsoft den Namen WinFX zu streichen und das, was bis dahin unter WinFX zusammgefasst wurde, zusammen mit dem .NET Framework 2.0 zum „.NET Framework 3.0“ zu machen. Außerdem gibt es kein WinFX SDK mehr, sondern ein Windows SDK, zu dem auch das bisherige .NET Framework SDK gehört. Aus der WinFX-Serie wird ab dieser Ausgabe die WPF-Serie, was sie im Grunde schon immer war - mehr ändert sich für Sie nicht. Inzwischen gibt es die Juni-CTP des Windows SDKs. Dieses arbeitet aber nicht mit der Beta 2 von Windows Vista zusammen, sondern benötigt schon eine aktuellere Version. Kleine Änderungen befinden sich in der Definition von Styles und NavigationWindows. XAMLPad wurde um den Visual Tree Explorer erweitert (Punkt 1 in Abbildung 1) - er stellt die Beziehungen der Komponenten in der Hierarchie grafisch dar und zeigt über ein weiteres Fenster, den Property Tree Explorer (Punkt 2 in Abbildung 1), die Eigenschaften des aktuell ausgewählten Elements an.
Installationshürden
Sollte sich die (De)Installation einer neuen Version von WinFX nicht durchführen lassen, kann dies gleich mehrere Gründe haben. Auf dem Rechner des Autors ließ sich seit über einem Jahr eine alte Version von WinFX problemlos deinstallieren und die neue einspielen. Jetzt kommen sich allerdings die Setup-Programme doch langsam in die Quere. Bei Fehlern wird in der Regel eine Meldung angezeigt, die besagt, dass (irgendwelche) älteren Komponenten nicht korrekt deinstalliert wurden und somit die neue Version nicht installiert werden kann. Eine Lösung ist die Reparatur der alten Version und der erneute Versuch diese zu deinstallieren. Eine für die Zukunft sinnvolle Lösung ist die Installation unter VMWare oder Virtual PC bzw. auf einem jeweils nagelneuen System. Eventuell hilft es noch, die Komponenten einzeln zu deinstallieren [6] - dazu wechselt man in das Verzeichnis ..\Windows\WinFX bzw. jetzt nach ..\Windows\Microsoft.NET\Framework\v3.0\ . Darunter befinden sich für die WPF, WCF und WF jeweils ein Unterordner mit den Installationsdateien WF_3.0_x86.msi , wpf.msi und wcf.msi . Werden diese ausgeführt, kann evt. die Installation repariert oder entfernt werden. Im Falle der WCF kann auch der Aufruf von ServiceModelReg.exe -ua zur korrekten Deinstallation beitragen. Wenn das nicht hilft, gibt es ja noch Google oder es steht wieder einmal eine Neuinstallation von Windows an.Textdarstellung mit der WPF
Obwohl die WPF mit ihren grafischen Fähigkeiten schon allerhand Ausdrucksmöglichkeiten besitzt, dürfen „einfache“ Textfeatures natürlich nicht fehlen. Um heutzutage in einer GUI einen formatierten Text auszugeben, sind bereits einige Klimmzüge notwendig. Insbesondere, wenn dieser Text verschiedene Formatierungen enthalten und vielleicht auch noch als Beschriftung in einer Komponente dienen soll. Mindestens letzteres ist ohne die Entwicklung eigener Komponenten bisher kaum möglich. Nun wurde bereits festgestellt, dass sich die Darstellung einer Komponente in der WPF aus verschiedenen Elementen zusammensetzt und dass man diese Zusammensetzung, den Visual Tree, auch selbst definieren kann. So weit zu gehen ist aber gar nicht notwendig, kann eine grafische Komponente doch grundsätzlich beliebige andere Komponenten enthalten, so auch Textelemente. Das folgende Beispiel setzt dies in die Praxis um: Statt die Beschriftung einer Schaltfläche direkt im Button -Element anzugeben, kann darin ein TextBlock -Element verschachtelt werden. Innerhalb eines Textblocks sind nun wieder verschiedene Angaben möglich. Einfachste Formatierungen wie kursiv, fett oder unterstrichen werden durch die Elemente I talic , B old und U nderline erreicht. Dazu ist einfach nur der betreffende Abschnitt in diese Elemente einzuschließen. Das TextBlock -Element kann auch einzeln angegeben werden. In diesem Fall wird es wie statischer Text behandelt. Das Ergebnis aus Listing 1 wird in Abbildung 2 gezeigt.Listing 1<StackPanel><Button><TextBlock><Italic>Eine spezielle <Bold>Beschriftung</Bold></Italic></TextBlock></Button><TextBlock>Eine noch <Italic>speziellere </Italic><Bold>Beschriftung</Bold></TextBlock></StackPanel>
Listing 2<Hyperlink NavigateUri="http://www.gowinfx.de" Click="OnHLClick">Alles zu WinFX</Hyperlink>
Darstellungseigenschaften
Bisher wurde der angezeigte Text nur durch die Verwendung verschiedener Elemente „formatiert“. Diese Elemente besitzen aber auch eine Menge von Eigenschaften, die in XAML über Attribute verändert werden können. Über die Inline-Elemente wie Span oder Italic lässt sich z.B. die eingeschlossene Schriftart des Texts formatieren. Die Attributnamen erinnern hier sehr an CSS (Cascading StyleSheets). Mittels der Eigenschaft FontFamily wird die Schriftart, mittels FontSize deren Größe und über FontWeight die Schriftstärke beeinflusst. Die Schriftfarbe wird einfach über die Eigenschaft Foreground gesetzt. Textblöcke verfügen über weitere Einstellmöglichkeiten. Diese wirken sich dann nicht nur auf einen Textabschnitt wie bei den Inline-Elementen sondern für den gesamten Inhalt eines Blocks aus. Mittels eines TextWrappings wird beispielsweise der automatische Zeilenumbruch aktiviert. Ansonsten fliest der Text einfach über den Rand hinaus, wenn er zu lang ist. Die Ausrichtung des gesamten Blocks wird über die Eigenschaft TextAlignment bestimmt, welche die Werte Left , Right , Center und Justify annehmen kann. Die Unterstützung des Blocksatzes ist dabei sicher die interessante Variante, denn dies erfordert von den Komponenten bereits eine umfangreichere Logik für die Darstellung und war deshalb in den aktuellen Komponenten häufig nicht verfügbar. Im Beispiel in Listing 3 wird ein TextBlock definiert. Dieser wird bereits mit einigen Eigenschaften vorbelegt - wie z.B. einer Zeilenhöhe von 20, einer Blockausrichtung und einem automatischen Zeilenumbruch. Damit der Text nicht so nah an den Rand des Containers reicht, wurde noch ein Rand über die Eigenschaft Margin festgelegt. Im Italic -Element wird das erste „Wort“ des Textes eingeschlossen, sodass es kursiv dargestellt wird. Außerdem werden Schriftstil und -farbe verändert. Das Element LineBreak , das sich mitten im Text befindet, erzeugt einen Zeilenumbruch. Wenn man nun die Größe des Fensters variiert, kann man insbesondere den Einfluss des Blocksatzes beobachten (Abbildung 4).Listing 3<TextBlock Margin="10" LineHeight="20" TextAlignment="Justify" TextWrapping="Wrap"><Italic FontFamily="Verdana" FontSize="13" FontWeight="SemiBold"Foreground="Blue">qwepoqwe</Italic> qwepoqwe pqowe qpweoqwe poqwieqwpoeiqweqwpoei qweqiweu ie qwe ioqwue qwopeiu <Bold>qweoiu qweopiq uweqwe</Bold>piwque qwopieu<LineBreak/>qwopieu qweo iuqwe qw qwe ioqwue wqopieu qwopeiuwqeoiqwu ewqoieu oipquwe qwoeiu qwoeiu qwoeiu wqeqw</TextBlock>
Komplexere Textausgabe
Ein TextBlock -Element ist nicht für umfangreichere Textausgaben vorgesehen und besitzt auch nicht alle möglichen Formatierungsmöglichkeiten der WPF. Das FlowDocument -Element kann neben den Inline-Elementen auch Block-Elemente zur Formatierung nutzen. Damit ergeben sich viele neue Anwendungsmöglichkeiten. Die einfachste Erweiterung ist der Einsatz von Absätzen, die durch ein Paragraph -Element festgelegt werden. Weiterhin ist es in einigen Elementen notwendig, deren Inhalt in einem Block-Element einzuschließen, und da bietet sich wieder das Paragraph -Element an. Das erste Einsatzgebiet wäre dann auch schon bei der Definition eines Listenelements. Mittels des Elements List wird eine Liste begonnen, der Einträge über ListItem -Elemente hinzugefügt werden. Über das Attribut MarkerStyle im List -Element lässt sich das Aufzählungszeichen festlegen, z.B. eine fortlaufende Nummerierung durch eine Zahl oder einen Buchstaben oder die Anzeige eines Kreises oder Rechtecks. Mittels dem Attribut StartIndex kann auch ein anderer Startindex zur Nummerierung festgelegt werden, in Listing 4 z.B. die Zahl 3. Abbildung 5 zeigt vier mögliche Aufzählungsvarianten.Listing 4<List MarkerStyle="Decimal" StartIndex="3"><ListItem><Paragraph>Decimal 3</Paragraph></ListItem><ListItem><Paragraph>Decimal 4</Paragraph></ListItem></List>
Listing 5<Table CellSpacing="5"><Table.Columns><TableColumn/><TableColumn/></Table.Columns><TableRowGroup><TableRow Background="LightBlue"><TableCell ColumnSpan="2"><Paragraph>Überschrift</Paragraph></TableCell></TableRow><TableRow Background="LightYellow"><TableCell><Paragraph>Zelle 1</Paragraph></TableCell><TableCell><Paragraph>Zelle 2</Paragraph></TableCell></TableRow></TableRowGroup></Table>
Der Rahmen für die Textausgabe
Damit Tabellen, Listen und Absätze genutzt werden können, müssen diese in ein FlowDocument eingebettet werden. Für die Anzeige eines FlowDocuments ist ein weiteres Rahmenelement notwendig, welches das Dokument einbettet und die Navigation darin erlaubt. Für Flow-Dokumente stehen drei Anzeigekomponenten bereit. Der FlowDocumentReader ist die komplexeste davon, aber hauptsächlich auf die angebotene Funktionalität bezogen. Das FlowDocument wird in den FlowDocumentReader eingebettet, wie es Listing 6 zeigt.Listing 6<FlowDocumentReader><FlowDocument><!-- Block-Elemente --><FlowDocument><FlowDocumentReader>
Floater und Figures
Innerhalb des Fließtextes lassen sich weitere, frei schwebende Blöcke, über Floater - und Figure -Elemente am Rand oder an einer fixen Position positionieren. Ein typisches Beispiel wäre eine Anzeige in einer Zeitung oder auf einer Webseite, die sich mitten im Text befindet. Über Figure -Elemente könnten aber auch Randnotizen implementiert werden. Die wichtigsten Eigenschaften zur Konfiguration eines Floaters sind seine Breite (die Höhe wird automatisch anhand der Seitenbreite und seines Inhalts berechnet) und seine horizontale Ausrichtung. In Listing 7 wird ein Floater am rechten Rand mit einer Breite von 100 angezeigt. Gegenüber einem Floater - kann ein Figure -Element genauer positioniert werden und mehr als eine Spalte in einem mehrspaltigen Dokument einnehmen. Zur Positionierung können z.B. die Eigenschaften HorizontalOffset und VerticalOffset sowie HorizontalAnchor verwendet werden. Zur Verwendung müssen die Elemente in einem anderen Block-Element eingebettet werden und können selbst wiederum verschiedene Blockelemente enthalten. In Abbildung 8 sind jeweils ein Figure (Punkt 1) und ein Floater (Punkt 2) enthalten, die durch den Code aus Listing 7 erzeugt werden.Listing 7<Paragraph>....<Figure Width="120" Background="LightBlue"HorizontalAnchor="ContentCenter"HorizontalOffset="10" VerticalOffset="10"><Paragraph FontFamily="Verdane" FontSize="9">Schauen Sie mal unter http://www.gowinfx.de vorbei.</Paragraph></Figure></Paragraph><Paragraph>...<Floater FontFamily="Verdane" FontSize="9" Background="LightGreen"Width="100" HorizontalAlignment="Right"><Paragraph>Bemerkung: Dieser Text sollte noch einmal Korrektur gelesen werden.</Paragraph></Floater>...</Paragraph>
Fazit
Auch bei der Textausgabe lässt sich die WPF nicht lumpen. Zwar ist für die manuelle Erstellung von Textdokumenten viel Arbeit notwendig, aber dies wird in der Regel ja automatisiert erledigt. Durch das XML-Format (konkret XAML) und die starke Anlehnung an HTML ist eine Verarbeitung von vorhandenen Dokumenten relativ einfach, zumal es auch eine Programmierschnittstelle gibt, um direkt mit Methoden auf die einzelnen Inhalte eines Dokuments zuzugreifen. Der Programmierer wird damit auch bei der Textdarstellung immer mehr zum „Designer“ einer Anwendung bzw. muss in der WPF deutlich mehr Wert auf die Designmöglichkeiten von Textdarstellungen legen als bisher. Die Namensänderung von WinFX in .NET Framework 3.0 hat der Begeisterung von Dirk Frischalowski, der bereits seit 2004 ein großer Fan der Betriebssystemerweiterung war, keinen Abbruch getan. Seine WPF-Serie wird daher auch in Zukunft Entwickler mit aktuellen Informationen rund um das .NET Framework 3.0 versorgen. Seine WinFX-Homepage hat nach wie vor die Adresse www.gowinfx.de.Links & Literatur
- [1] Homepage des .NET Frameworks 3.0: msdn.microsoft.com/winfx/
- [2] Änderungen in der Juni-CTP: blogs.msdn.com/tims/archive/2006/06/23/644558.aspx
- [3] WPF-Downloads: msdn.microsoft.com/winfx/downloads/presentation/
- [4] Aurora 9.0 WPF-Editor: www.mobiform.com
- [5] Vorstellung des .NET Frameworks 3.0: blogs.msdn.com/somasegar/archive/2006/06/09/624300.aspx
- [6] Deinstallation von WinFX: forums.microsoft.com/MSDN/ShowPost.aspx?PostID=511304&SiteID=1






