Silverlight 3: Styles anwendungsübergreifend verwenden

In diesem Beitrag soll gezeigt werden, wie man Styles in Silverlight 3 anwendungsübergreifend verwenden kann. Ich arbeite derzeit an einem Projekt, das unter anderem aus mehreren Silverlight-Anwendungen besteht. Das Aussehen dieser Anwendungen soll zentral verwaltet werden. Da ohnehin bereits eine gemeinsame Silverlight-Klassenbibliothek benutzt wird, weil die Anwendungen gleiche Daten nutzen, lag es nahe, auch die verwendeten Styles dort abzulegen.

Eine Recherche im Web brachte ziemlich viele Anleitungen zutage, wie man so etwas erreichen kann. Beim Testen mußte ich aber feststellen, daß keine der Anleitungen funktioniert. Visual Studio 2010 stellt die Styles zwar dar und die Anwendung läßt sich problemlos kompilieren, aber beim Versuch sie im Browser darzustellen erhält man eine Fehlermeldung. Im Debugger zeigt sich, daß die Styles aus der gemeinsamen Bibliothek dafür verantwortlich sind.

Nach ausgiebigen weiteren Recherchen bin ich auf die Lösung gestoßen: beim Einbinden der Styles aus der Klassenbibliothek muß ein zusätzlicher Schrägstrich / angegeben werden. Offenbar unterschied sich die Beta von Silverlight 3 an dieser Stelle von der RTM-Version und alle Anleitungen, die ich fand, beruhten auf der Beta (mit der ich nie zu tun hatte).

Deshalb hier nochmal die Vorgehensweise für alle, die dasselbe Problem haben – und für mich selbst zum Nachschlagen 🙂 Getestet mit Visual Studio 2010 und Silverlight 3.

Schritt 1: Silverlight-Klassenbibliothek mit Styles anlegen

Wir brauchen zuerst ein Projekt vom Typ "Silverlight Class Library", in dem wir alle gemeinsam genutzten Komponenten ablegen:

Es gibt dabei nichts besonderes zu beachten. Wir fügen dem Projekt jetzt ein Element vom Typ "Silverlight Resource Dictionary" hinzu, in dem wir die gemeinsam genutzten Styles ablegen:

Ich habe die Datei Styles.xaml genannt. Für die Datei muß im Eigenschaftenfenster unter "Build Action" unbedingt Resource eingestellt werden! Alles andere wie z.B. Embedded Resource, das wahrscheinlich viele aus der Windows Forms Entwicklung kennen, funktioniert nicht.

Wie man Silverlight-Styles erstellt und benutzt, soll hier nicht weiter gezeigt werden. Hier soll nur beispielhaft gezeigt werden, wie die Datei aufgebaut ist:

<ResourceDictionary

  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;

  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"&gt;

  <Style x:Key="InputFormCellLight" TargetType="Border">

    <Setter Property="BorderBrush" Value="Black"/>

    <Setter Property="BorderThickness" Value="1,1,0,0"/>

  </Style>

</ResourceDictionary>

 

Schritt 2: die Styles aus der Bibliothek verwenden

Im zweiten Schritt soll gezeigt werden, wie man die Styles aus der Bibliothek verwendet. Dazu legen wir ein Projekt für die eigentliche Silverlight-Anwendung an (Silverlight Application) und fügen einen Verweis auf die Silverlight-Klassenbibliothek hinzu. Sonst gibt es auch bei diesem Projekt nichts besonderes zu beachten.

Damit wird die Styles verwenden können, müssen sie zuerst verfügbar gemacht werden. Am sinnvollsten macht man das in der Datei App.xaml, damit die Styles in der gesamten Anwendung verfügbar sind. Die Datei sieht dann so aus:

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;

  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml&quot;

  x:Class="SilverlightApplication.App">

  <Application.Resources>

    <ResourceDictionary>

      <ResourceDictionary.MergedDictionaries>

        <ResourceDictionary Source="/SilverlightLibrary;component/Styles.xaml"/>

      </ResourceDictionary.MergedDictionaries>

    </ResourceDictionary>

  </Application.Resources>

</Application>

 

Wichtig ist dabei diese Zeile und genau dort lag auch mein anfängliches Problem:

  <ResourceDictionary Source="/SilverlightLibrary;component/Styles.xaml"/>

Im Source-Attribut wird zuerst der Name der Klassenbibliothek angegeben, d.h. der Name der DLL ohne Dateierweiterung. Wichtig ist hier der führende Schrägstrich! Bei der Beta von Silverlight 3 war dieser offenbar nicht notwendig. Danach folgt durch ein Semikolon getrennt der Pfad zur Datei, die die Styles enthält. Das Präfix "component" muß dabei immer vorangestellt werden!

Damit stehen die zentral verwalteten Styles zur Verfügung und können so benutzt werden:

Style="{StaticResource InputFormCellLight}"

Ein Gedanke zu “Silverlight 3: Styles anwendungsübergreifend verwenden

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s