Wer sich mal die Frage gestellt hat, wie der Datentyp DateTimeOffset richtig zu interpretieren ist …

  1. ist es UTC +/- den Offset um auf die lokale Zeit zu kommen?
  2. oder lokale Zeit inkl. +/- und man muss rechnen um auf UTC zu kommen?

ein ‘select SYSDATETIMEOFFSET()’ ausgeführt auf ner Maschine, bei der man weiß, was wirklich eingestellt ist,  beantwortet die Frage.

Der Select gibt Nummer 2 zurück, also lokale Zeit, inkl. der Information, in welcher Zeitzone die Daten geschrieben wurden.

Sommerwinterzeit wird dabei berücksichtigt, ein select auf SYSDATETIMEOFFSET() im Juni gibt zurück: 2010-06-17 09:08:40.3750000 +02:00 also + 2 Stunden da Sommerzeit.

Nachfolgend ein kleines Beispiel, wie man die Daten einer Klasseninstanz in XML serialisiert.

Über die XML-Attribute wird die Repräsentation der Eigenschaften im XML geregelt.

using System.Xml;
using System.Xml.Serialization;
using System.IO;

namespace Data2Xml
{
    [XmlRoot("Person")]
    public class Person
    {
        [XmlElement("Firstname")]
        public string Firstname { get; set; }

        [XmlElement("Name")]
        public string Name { get; set; }

        public Person()
        {
        }

        public string ToXml()
        {
            XmlSerializer s = new XmlSerializer(this.GetType());
            StringWriter xmlWriter = new StringWriter();
            s.Serialize(xmlWriter, this);
            xmlWriter.Close();

            return xmlWriter.ToString();
        }
    }
}

Aufrufbeispiel:

Person per = new Person();

per.Name = "Mustermann";
per.Firstname = "Max";

string xml = per.ToXml();

Ergebnis ( Rückgabewert von ToXml() ):

<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <Firstname>Max</Firstname>
 <Name>Mustermann</Name>
</Person>

“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

Die vorgehensweiße eine native DLL zu signieren ist eine andere wie bei .NET Projekten, bei der man Unterstützung durch das Visual Studio erhält. Welche DLLs müssen überhaupt signiert werden? Ab Windows Vista müssen Treiber und auch selbst geschriebene WIC Codecs signiert werden, so dass sie vom Windows BS angenommen werden. Die Anleitung gilt aber auch für EXEs, OCXs und CABs.

Vorgehensweiße:

  • Windows SDK herunterladen und installieren (makecert, signtool,…)
  • Testzertifikate erstellen (und installieren)
  • Software Publishing Certificate (SPC) erstellen
  • Bibliothek (oder andere Datei) signieren
makecert.exe -sv CodeSignPrivateKey.cer -r -n "CN=[Ihr Name],  OU=[Ihre Appteilung], O=[Ihre Firma], E=[IhreMail@IhreDomain.xy]" -ss NS_CertStore CodeSignCert.cer

Das SPC erstellen:

pvk2pfx.exe -pvk CodeSign.pvk -pi [Ihr Passwort] -spc CodeSign.spc -pfx CodeSign.pfx -f

Zertifikat installieren:

certutil -user -p <Ihr Passwort> -i mportPFX d:signingCodeSign.pfx

Signieren:

signtool sign /v /ac CodeSign.cer /s my /n [Ihr Name/CN] /t http://timestamp.verisign.com/scripts/timestamp.dll AitCodec.dll

Wenn alles ok erfolgt die Ausgabe:

The following certificate was selected:
Issued to: [Ihr Name]
Issued by: [Ihr Name]
Expires:   Sun Jan 01 00:59:59 2040
SHA1 hash: 697330637D668644A9277B395026A6F720BA40B5

Cross certificate chain (using machine store):
Issued to: [Ihr Name]
Issued by: [Ihr Name]
Expires:   Sun Jan 01 00:59:59 2040
SHA1 hash: 697330637D668644A9277B395026A6F720BA40B5

Done Adding Additional Store
Successfully signed and timestamped: AitCodec.dll

Number of files successfully Signed: 1
Number of warnings: 0
Number of errors: 0

Die Bildformate WMF und EMF (wikipedia) werden nicht nativ von WPF unterstützt, während in einer WinForms-Anwendung die Klasse Metafile verwendet werden kann.

private void button1_Click(object sender, EventArgs e)
{
    Stream s = File.Open("c:\Zeichnung.wmf",
        FileMode.Open, FileAccess.Read);

    Metafile emf = new Metafile(s);
    s.Close();

    Graphics g = CreateGraphics();
    g.DrawImage(emf, 0, 0, 300, 500);
    emf.Dispose();
    g.Dispose();
}

Für WPF gibt es seitens Microsoft keinen Support für die (von MS selbst entwickelten) Bildformate WMF und EMF. In einem von MVPs besuchten MSDN Forum heißt es: “WPF does not support the EMF and WMF image formats. These formats are more susceptible to security vulnerabilities than other image formats, so we do not intend to support them.“… “A 3rd party could write a codec for EMF or WMF that’s compatible …”

Gesucht gefunden: Ab2d.ReaderWmf – metafile importer

Refernez zur DLL hinzu +

<ab2d:WmfViewbox Source="Images/Zeichnung.wmf" />

oder

<ab2d:WmfDrawing Source="Images/Zeichnung.wmf"/>

WmfDrawing soll eine bessere Performance bieten als WmfViewbox da ersteres beim Rendern DrawingGeometry, StreamGeometry usw. verwendet während WmfViewbox sich auf Shapes (Canvas, Path, Polyline, …) stützt.
Eine Testversion ist auf der Internetseite ebenfalls zu finden. Eine Entwickler-Lizenz startet für den Runtime-Render bei $ 219 und endet bei $ 1399.

Eine weitere Möglichkeit ist auch die Konvertierung der Bilder in xaml (baml) wie in diesem Blogeintrag beschrieben. Das erfordert bei einer größeren Anzahl an Bildern allerdings jede Menge Arbeit.

Mit Einführung des Windows Imaging Component (WIC) zu XP SP3 und .NET 3.0 heißt es dann von Microsoft: “With the WIC (Windows Imaging Component) infrastructure, we provide the ability for ISVs to implement their own CODECs.”

Ein Download in mehreren Sprachen in 32 und 64 Bit ist unter den entsprechenden Links zur finden.

Zusammenfassung / Kurzform des Artikel “What’s New in Silverlight 4 Beta?

Wie es um die neue Silverlight Version 4 steht wurde auf der PDC im November verkündet. Es sind einige Neuerungen zu erwarten. Eine Beta läßt sich auch bereits herrunterladen die aber zum Visual Studio 2010, derzeit als Beta 2 verfügbar, installiert werden muss. Damit ist auch gleich zu erkennen, dass die Release des Studio 2010 ohne SL 4 daherkommt. SL 4 und die Tools lassen sich aber auch auf die Visual Web Developer Express 2010 hinzuinstallieren, die ebenfalls als Beta 2 zur Verfügung steht. Die neue Release soll Silverlight so aufbohren, dass sich damit Anwendungen erstellen lassen, die bisher dem Desktop vorbehalten waren. Den Vergleich mit einem JavaApplet scheue ich allerdings, da ich nicht die Grenzen von JavaApplets kenne. Multimedia Fähigkeiten von Flash und Businessapplikationen wie in einem JavaApplet, oder einfach nur .NET und WPF im Kleinformat. Folgende Liste zeigt die zu erwartenden Neuerungen, ohne Anspruch auf Vollständigkeit:

  • Druckausgabe, sowohl Bildschirmhardcopy und Bildschirmunabhängig.
  • mehr als 60 anpassbare Steuerelemente, unter anderem: RichTextbox, Masked Textbox mit Eingabevalidierung, voll ausgestattetes DataGrid
  • WCF RIA Services: Einführung der WCF in SL
  • offizielle (nicht umfassende) Unterstützung von SL4 Bibliotheken unter .NET CLR. siehe Artikel hier
  • Verbesserungen an DataBinding, unter anderem Formatierungen von Strings
  • Verbesserte Unterstützung von SL in Visual Studio ab Version 2010
  • Voll editierbare Entwickleroberfläche für erweiterte Steuerelemente und besseres Layouting
  • Besseres Property Grid und neue Editoren für einige Eigenschaften
  • Generell Verbesserungen im Studio 2010 + Blend
  • Unterstützung von WebCam und Mikrofon
  • Lokales Video Capture (WebCam) für die Kommunikation
  • Drag&Drop und Copy&Paste über die SL-Anwendung hinaus (Desktop-Anwendungen).
  • Unterstützung des Mausrades
  • Kontextmenü über rechte Maustaste (sonst kommt ja nur ein Menü mit “Über Silverlight”
  • Unterstützung von Google´s Chrome
  • Performanceverbesserungen
  • MultiTouch
  • Multicast networking
  • Schutz der Inhalte über DRM
  • Rendern von HTML innerhalb der SL Anwendung

Ein neuer Projekttyp im Studio 2010 erlaubt es, SL 4 Anwendungen so zu entwickeln, dass Sie wie normale Anwendungen auf dem lokalen Rechner “installiert” und gestartet werden können. Vom Look&Feel erscheinen sie dann auch wie diese. Vom Browser bleibt dann nur der Rahmen übrig, auch die Sandbox bleibt weiterhin bestehen. Vertrauenswürdige Anwendungen können auch vollen Dateizugriff auf das Benutzerverzeichnis zum Schreiben und Lesen von Dateien erhalten. Interaktion mit Office und anderen Anwendungen via COM.

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.