WPF

“Styles” in WPF zur Laufzeit austauschen. Mit dieser kleinen Demo will ich zeigen wie man es machen könnte.

Das Demoprojekt zeigt ein Fenster mit 4 Buttons. Die ersten beiden Schaltflächen wechseln den globalen Stil, der sich dann auf alle Schaltflächen auswirkt. Die erste Schaltfläche lädt einen Stil von einer auf der Festplatte abgelegten xaml-Datei nach, die zweite einen Stil aus den im Projekt  enthaltenen Resourcen.
Die dritte Schaltfläche setzt einen Stil für sich alleine und die vierte setzt alles wieder auf den Orginalzustand.

Beginnen wir mit dem Fenster:

<Window.Resources>
    <Style x:Key="Style1" />
</Window.Resources>
<StackPanel>
    <Button Style="{DynamicResource GlobalStyle}" Height="33" Margin="10"
        Name="btnStyle1" Click="btnStyle1_Click">GlobalStyle 1</Button>
    <Button Style="{DynamicResource GlobalStyle}" Height="33" Margin="10"
        Name="btnStyle2" Click="btnStyle2_Click">GlobalStyle 2</Button>
    <Button Style="{DynamicResource GlobalStyle}" Height="33" Margin="10"
        Name="btnIndividualStyle" Click="btnIndividualStyle_Click">IndividualStyle</Button>
    <Button Style="{DynamicResource GlobalStyle}" Height="33" Margin="10"
        Name="btnReset" Click="btnReset_Click">Reset</Button>
</StackPanel>

Jeder Button erhält über die Style-Eigenschaft eine Verweis auf eine “DynamicResource”, die leer ist. Dadurch werden die Schaltflächen ganz normal in Ihrem regulären Systemstil angezeigt.

Nun zum Laden und wechseln der Stile. Im folgende Codeabschnitt wird ein xaml-ResourceDictionary von der Festplatte nachgeladen und dem globalen Stil zugewiesen.

private void btnStyle1_Click(object sender, RoutedEventArgs e)
{
    ResourceDictionary style;

    using (FileStream fs = new FileStream("GlobalStyle1.xaml", FileMode.Open,
        FileAccess.Read))
    {
        style = (ResourceDictionary)XamlReader.Load(fs);
        this.Resources = style;
        fs.Close();
    }

    if (null != style)
    {
        this.Resources = style;
    }
}

Das ResourceDictionary enthält dabei folgenden xaml-Code:

Nach Betätigen der Schaltfläche erhalten alle Schaltfläche einen roten Hintergrund.

Schaltfläche 2 lädt die Resourcen nun nicht von der Platte, sondern aus den Programmresourcen:

private void btnStyle2_Click(object sender, RoutedEventArgs e)
{
    ResourceDictionary style2 = new ResourceDictionary();

    style2.Source =
        new Uri("/DynamicStyleLoader;component/GlobalStyle2.xaml",
            UriKind.RelativeOrAbsolute);

    this.Resources = style2;
}

Nach Betätigen der Schaltfläche erhalten alle Schaltfläche einen grünen Hintergrund.

Einen individuellen Style für nur eine Schaltfläche läßt sich so zuweisen:

private void btnIndividualStyle_Click(object sender, RoutedEventArgs e)
{
    ResourceDictionary indStyle = new ResourceDictionary();

    indStyle.Source =
        new Uri("/DynamicStyleLoader;component/IndividualStyle.xaml",
            UriKind.RelativeOrAbsolute);          

    this.btnIndividualStyle.Style = (Style)indStyle["IndividualStyle"];
}

Nach Betätigen der Schaltfläche erhält genau die Schaltfläche einen blauen Hintergrund.

Um alles wieder auf Standard zurückzusetzen reicht es, die Resourcen des aktuellen Fensters (this) wieder zu “nullen”. Allerdings muss für die Schaltfläche mit dem individuellen Stile, sofern man ihr diesen durch betätigen der Schaltfläche vorher zugewiesen hat, die “ResourceReference” zum globalen Stil wiederhergestellt werden.

private void btnReset_Click(object sender, RoutedEventArgs e)
{
    this.Resources = null;
    this.btnIndividualStyle.SetResourceReference(Button.StyleProperty,
        "GlobalStyle");
}

Fertig.

In einem weiteren Artikel hab ich beschrieben, wie eine Silverlight DLL auch unter .NET/WPF verwendet werden kann. Dabei ist man allerdings auf die Verwendung von nur wenigen Namesspaces beschränkt. Wie ist es jedoch bei Entwicklung einer UI bis hin zu Custom Controls. Hier möchte ich mich auf die Entwicklung eines Custom Controls konzentrieren, da das für mich in einem besonderen Fokus steht.

Habe zunächst versucht die Testentwicklung unter Visual Studio 2010 und Silverlight 4 Beta durchzuführen. Zu deisem Zeitpunkt war eine RC des VS verfügbar, jedoch konnte man die Silverlight 4 Beta nur zum Studio Beta installieren. Gequält durch viel zu viele Abstürze des VS, vermutlich hervorgerufen durch die komplexere Projektstruktur mit Links zu Dateien in der “Solution” und Prokjekte, habe ich nun das Studio 2008 und SL 3 verwendet. Einfachere Projekt konnte ich in der Beta des Visual Studio allerdings anstandslos erstellen, bauen und debuggen.

Probleme und Lösungsvorschläge zum CrossDevelopment eines CustomControls:

Continue reading

Zusammengefasst aus “What’s New in the .NET Framework Version 4

Wichtig: Nur ne Beta, kann sich also alles wieder ändern.

  • Kompatibilität und Bereitstellung
  • Parallele Verarbeitung (MultiCore)
  • Verbesserung des Sicherheitsmodels
  • Renovierung der CLR
  • Netzwerk
  • Web (ASP.NET)
  • DesktopUI (WPF)
  • Daten / Datenbanken (ADO.NET)
  • WCF und WF

Zusammengefasst aus dem Artikel Sharing Silverlight Assemblies with .NET Apps aus dem CLR Team Blog von Miguel Madero.

Schon auf der PDC wurde angekündigt, dass die Version 4 von Silverlight es ermöglichen wird, Bibliotheken zu Implementieren, die sowohl von Silverlight 4 als auch von der .NET 4 CLR verwendet werden kann.

Das beschränkt sich allerdings auf die Verwendung von derzeit vier SL4-Bibliotheken, die als Referenz zu einem SL4-Projekt hinzugefügt sein dürfen.

  • Mscorlib
  • System
  • System.Core
  • System.ComponentModel.Composition
  • Microsoft.VisualBasic

Wird nun eine SL4 Bibliothek unter Verwendung dieser Bibliotheken erstellt, kann diese auch von einer .NET 4 Applikation verarbeitet werden.  SL4 goes .NET4 und nicht umgekehrt! Das liegt daran, dass die gleichnamigen .NET Bibliotheken über einen deutlich größeren Umfang an Typen verfügen.

Dieses Eigenschaft wird von den MS Leuten als “assembly portability” bezeichnet.

Diese neuen Mglichkeiten zielen hauptsächlich auf die Implementierung einer Geschäftslogik oder Datenverarbeitung ab, die dann in beiden Lagern verwendet werden kann. Die Unterschiede im Bereich der Grafik zwischen WPF und SL sind derzeit (und wird wohl auch so bleiben) zu groß, um hier eine Portabilität herzustellen.

Vorgehensweiße im Visual Studio:

  1. Projekte erstellen
    a) .NET WPF Anwendung
    b) Silverlight class library hinzugefügt
    c) Silverlight Projekt erstellt
  2. Referenzen zur Bibliothek hergestellt.
  3. Implementieren
  4. Starten

Nachgeschaut und überprüft:
Fungiert auch mit Studio 2008, SL3 und .NET3.5. Man konnte die Referenz zur SL4-Lib sogar auf das Studioprojekt angeben und musst nicht direkt die DLL referenzieren. Eine statische “return Hallo Methode” konnte problemlos angesprochen werden.

Mit Studio 2010, SL4 und .NET 4 klappte das nicht so reibungslos. Hier musste man direkt die DLL als Referenz hinzufügen, das galt auch bei einer SL3-DLL.