Dienstag, 22. Juli 2014

Barcode mit ZXing.Net Generieren

Um einen Barcode mit der ZXing.Net API zu erstellen braucht es nicht viel. Man erstellt sich eine Instanz der Klasse BarcodeWriter aus der ZXing.Net API. Diesem "writer" wird das gewünschte Format übergeben und wenn nötig noch weitere Parameter zur Größe.
Mit der Methode "write" kann dann der gewünschte Barcode erstellt werden.

Siehe Beispiel:











Als Rückgabe der Methode erhält man ein PixelData-Objekt welches sich in ein WriteableBitmap umwandeln lässt, welches wir dann in der App verwendeten können.

Ich hoffe ihr habt viel Spaß beim selber ausprobieren, bis zum nächsten mal.

Windows Phone 8.1 Barcode Scanner mit ZXing.Net

Im voran gegangen Post Windows 8.1 Barcodescanner App mit ZXing.Net von mir, habe ich darauf hingewiesen das unter Windows Phone 8.1, uns der CameraCatureUI Dialog nicht zur Verfügung steht und aus diesem Grund die Methoden der MediaCature Klassen verwendet werden müssten.

Hier nun das Beispiel unter Windows Phone 8.1. Dieses Vorgehen kann auch unter Windows 8.1 in einer Windows Store App verwendet werden.

Zu beginn müssen wir die das MediaCature Objekt initialisieren und ein paar Einstellung vornehmen.
 















Um die richtig Kamera Id zu erhalten, verwende ich die folgende Methode diese ermittelt anhand gewünschten Kamera Position die Id. Sollte es keine Rückwertige Kamera geben wird die erste gefunden verwendet.









Anschließend kann wie hier im Beispiel eine Vorschau gestartet werden und auf ein Event Reagiert werden mit dem wir das Bild dann an unsere Barcode Scanner Klasse (siehe Windows 8.1 Barcodescanner App mit ZXing.Net ) übergeben.













Es ist äußerst wichtig das wir das MediaCapture-Objekt und verwandte Objekte beim Anhalten der App korrekt beenden und löschen. Andernfalls können andere Apps, die auf die Kamera des Gerätes zugreifen, gestört werden.

Daher ist es am besten für diese zwecke das MediaCapture-Objekt und das verwendete Vorschau CaptureElement als öffentliche Eigenschaften in der app.xaml.cs zu deklarieren. Im OnSuspending Ereignishändler rufen wie dann die entsprechend CleanUpCatureResouces Methode auf.

























Ich wünsche euch viel Spaß beim selber ausprobieren und bis zum nächsten mal.

Freitag, 18. Juli 2014

Windows 8.1 Barcode Scanner App mit ZXing.Net API

Mit Hilfe der ZXing .Net API http://zxingnet.codeplex.com/ kann man recht einfach und unkompliziert einen Barcodescanner für eine Windows Store App erstellen.
Hier nun ein kleines Beispiel mit Hilfe des CameraCatureUI Dialoges, dieser Dialog steht uns unter Windows Phone 8.1 nicht zur Verfügung hier müssen wir die Methoden der MediaCature Klasse verwenden weiter Informationen unter Aufnehmen und Speichern von Fotos aus der Kamera

Zunächst erstellen wir mit dem CameraCaturUI Dialog eine StorageFile die unser aufgenommenes Foto hält.


Die Datei reichen wir an eine von mir erstellte BarcodeScanner klasse weiter die den Barcode mit Hilfe des ZXing.Net API den Barcode ausliest und mir über das Event BarcodeScanCompleted den ausgelesenen Barcode mitteilt.. Die geschieht in der Methode ScannBarcodeAsync.


Um in der jeweiligen Aufrufs Seite auf den Abschluss des Scans reagieren zu könne wurde von mir in der Klasse noch ein Event erstellt welches dem ausgelesen Barcode und ein Flag zurückgibt ob der Scan erfolgreich war.


Schon haben wir einen Barcode Scanner implementiert und könne die Barcode die über die ZXing.Net APIT erkannt werden können. Auslesen.

Ich wünsche euch viel Spaß und bis zum nächsten mal.

Mittwoch, 16. Juli 2014

Erstellen einens einfachen REST Service

Im Grunde bezeichnet REST die Idee, dass eine URL genau einen Seiteninhalt als Ergebnis einer serverseitigen Aktion (etwa das Anzeigen einer Trefferliste nach einer Suche) darstellt.

REST setzt auf ein zustandsloses Client-Server-Protokoll, wobei im Normalfall HTTP oder HTTPS eingesetzt wird. Jede REST-Nachricht enthält dabei alle Informationen, die für den Server bzw. Client notwendig sind, um die Nachricht zu verstehen. Zustandslosigkeit wirkt sich begünstigend auf die Skalierbarkeit eines Webservices aus. Das ist natürlich genau das was wir für unsere Apps brauchen, etwas was schnell und einfach unsere App mit Daten füttert.
Und da die Daten als XML Ausgelesen werden, können wir diese REST Services sogar Plattformunabhängig nutzen.

Hier folgt nun ein kleines Beispiel für das erstellen eines REST Service. Dieser Service wird uns entweder eine Liste von Produkten oder über Parameter ein gewünschtes Produkt zurück geben. Wir betrachten somit nur den Lesenden zugriff über "GET"

1. Schritt eins Erstellen eines WCF Service Projekt

  • Starten Sie Visual Studio (im meinem Beispiel Visual Studio 2013)
  • Erstellen Sie ein neues Projekt vom Typ WCF-Dienstanwendung
Erstellen WCF-Dienstanweisung

2. Datenquelle für die Rückgabe erstellen

  • Für diese Beispiel erstellen wir ein einfache Klasse mit dem Namen Product.cs in der wir die Eigenschaften des Produktes erfassen können.

Des weiteren fügen wir eine Singelton-Klasse Namens Products.cs hinzu, von der wir die Methoden implantieren mit den wir an die Daten kommen wollen. Hier im Beispiel wird die Liste in einer einfachen Dummy Methode erstellt. Dies kann man natürlich auch gegen einen Datenbank Operation austauschen.


3. Erstellen des Service Contract

Fügen Sie Ihrem Projekt eine neues WCF-Dienst Element Namens ProductRESTService.svc hinzu.


Sie können die nicht benötigten Klasse Service1.svc, IService1.cs und Service1.cs gerne löschen. Beim hinzufügen werden sowohl die Service Klasse ProductRESTService.svc,  als auch der Service Vertrags als IProductRESTService.cs erstellt.

Im Service Vertrags als IProductRESTService.cs implementieren wir die Methode die über den Service zur Verfügung stehen sollen. Hierbei sollte der Namespace System.ServiceModel.Web eingebunden werden.


Das wichtige hierbei ist es zu die Nutzung des WebInvoke Attributes und seiner Parameter zu verstehen.
  • Method = "GET", stellt den HTTP GET Request da.
  • ResponseFormat  = WebMessageFormat.Xml, hier können wir zwischen XML oder JSON als Rückgabe Format auswählen.
  • BodyStyle = WebMessageBodyStyle.Bare, siehe WebMessageBodyStyle-Enumeration
  • UriTemplate ="GetProductById/{id}", siehe UriTemplate und UriTemplateTable 

4. Erstellen der REST Service Klasse

In der Service Klassen ProductRESTService.svs.cs müssen wir nun noch die im Service Vertrags definierten Methoden des Interfaces IProductRESTService implementieren und mit den jeweiligen Aufrufen bestücken.



5. Konfigurieren der Service

Was jetzt noch fehlt ist die Konfiguration des Dienst in der Web.config für einen REST Dienst wird das webHTTPBinding verwendet



6. Testen des REST Dienstes

Um den Dienst zu Testen können wir ihn  über einen rechst Klick auf die ProductRESTService.svs > Im Browser anzeigen (Internet Explorer) ausführen.
Die wird uns auch die Standard Dienst Seite leiten in der die Handhabung des Dienstes für WCF Clients beschrieben wir.
Wir wollen aber REST, das einzige was wir machen müssen ist die URL zu änderten und zwar mit dem jeweiligen Befehl des Service Vertrages:

http://localhost:54964/ProductRESTService.svc/GetProductById/3
 oder

http://localhost:54964/ProductRESTService.svc/GetProductList/

Dies sollte uns das gewünschte XML zurückgeben.

Und schon ist unser einfacher REST Dienst fertig. Viel Spaß bei selbst probieren und bis zum nächsten mal.

Dienstag, 15. Juli 2014

Meine Blogs jetzt auch als App für Windows 8.1 und Windows Phone 8.1

Hallo zusammen,

hier jetzt auch mal ein Praktisches Beispiel für ein Universal-App für Windows 8.1 und Windows Phone 8.1 Apps. Ihr könnt nun meine Blogs auch über dies App folgen und seit so immer auf dem laufenden.

Ich könnt die App im Windows Store unter dem folgenden Link beziehen:

Windows 8.1

http://apps.microsoft.com/windows/app/ccs-blogreader/26d01b75-35e9-437f-8ac8-44eb8584538a

Windows Phone 8.1

http://www.windowsphone.com/s?appid=120d63f1-c3d4-4364-a1f6-0891cc93c8b6

Dienstag, 8. Juli 2014

XAML Formatieren von Bindings mit IValueConverter Interface


In vielen Fällen kommt es vor das, dass Format was man von einer Datenquelle erhält, nicht der passende Formatierung für den Anzeigezweck entspricht. Man kann natürlich die Datenquelle anpassen oder die ToString()Methoden Überschreibt. Aber die kann man auch eleganter über einen Konverter erreichen.

Um einen Konverter für eine Type zu erstellen kann man sich des Interfaces IValueConverter bedienen.

Diese Interface bedingt die Methode Convert und ConvertBack und können im XAML beim Binding der Datenquelle wie folgt verwendet werden.

< UserControl.Resources>
       <Converter:DateTimeConverter x:Key="DateTimeConverter" />
</UserControl.Resources>

<GridViewColumn
EntryDateMember ="{Binding Path=EntryDate, Converter={StaticResource DateTimeConverter}}" />
Die zugehörige C# Klasse kann mit folgendem Listing verwendet werden.
public class DateTimeConverter : IValueConverter
{
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value != null)
        {
            return ((DateTime)value).ToString("dd.MM.yyyy");
        }
        else
        {
            return String.Empty
        }

    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
   {
      return DateTime.Parse(value.ToString());
   }
}



Im diesem Beispiel wird das Entrittsdatum im Format “dd.MM.yyyy” zurückgegen. Man kann diese Konverter Klassen auf Bedingungsprüfungen verwenden, um Beispielsweise die Darstellung des Textes zu verändern über Abhängigkeiten der Datenquelle.
Im Beispiel wird die Schriftdicke durch einen Booleschen Wert bestimmt.

public class BooleanToFontWieghtConverter
             : IValueConverter
{
        public object Convert(object value, Type targetType, object parameter, string language)
        {
            string ret = "Normal";
            if((bool)value)
            {
                ret = "ExtraBold";
            }
            return ret;
         }

       public object ConvertBack(object value, Type targetType, object parameter, string language)
      {
            return value.ToString().Equals("ExtraBold");
      }
}

Für weiter Informationen siehe MSDN IValueConverter-Schnittstelle