Archiv | Silverlight RSS for this section

Die Wolke liefert Daten

Für zukünftige Aktivitäten im Business Bereich bietet Microsoft ja SQL Azure auf seiner Cloud Windows Azure an. Seit einer gewissen Zeit arbeite ich mich so ein wenig dort ein. Jetzt habe ich gestern einen Post gefunden wie man die Datenhaltung aufbaut in Verbindung mit WP7.

image

Abb.: Datenhaltung SQL Azure nach WP7

In einer Step für Step Anleitung wird vom Service Contract über den Service hin zur fertigen Anwendung alles ausführlich beschrieben. Der Transfer geht über JSON DTO Service. Es ist wirklich nicht so schwer dieses zuverstehen. Hier noch ein paar Zeilen Code:
using System.Runtime.Serialization;

namespace RESTJSONStudentsData
{
[DataContract]
public class PersonDTO
{
[DataMember]
public string StudentId { get; set; }
[DataMember]
public string FirstName { get; set; }
[DataMember]
public string LastName { get; set; }

}
}

Abb.: Data Contract

Und jetzt nich die WCF Verbindung kurz beschrieben:
using System.Collections.Generic;
using System.ServiceModel;
using System.ServiceModel.Web;

namespace RESTJSONStudentsData
{
[ServiceContract]
public interface IService1
{
[OperationContract]
[WebGet(UriTemplate=“/Persons“,
RequestFormat=WebMessageFormat.Json,
ResponseFormat=WebMessageFormat.Json]
List<PersonDTO> GetPersons();
}
}

Hier sollte hervorgehoben werden die Json Format Einstellungen. Diese können dann ganz einfach per DataContractJsonSerializer konvertiert werden. So ist es echt einfach geworden.

Quelle:

Data from Cloud on Windows Phone

 

Navigation mit Service

Der NavigationService im MVVM ist für die Steuerung zwischen Views und ViewModel. Wie man diesen Service erstellt und einsetzt, dass kann man im  Rob Garfoot’s Blog in seinem aktuellen Post lesen.

Hier das grundliegende Interface:

public interface INavigationService
{
    void Navigate(string url);
}
Danach sollte die Class erstellt werden
public class NavigationService : INavigationService
{
    private readonly System.Windows.Navigation.NavigationService _navigationService;
    public NavigationService(System.Windows.Navigation.NavigationService navigationService)
    {
        _navigationService = navigationService;
    }
    public void Navigate(string url)
    {
        _navigationService.Navigate(new Uri(url, UriKind.RelativeOrAbsolute));
    }
}
Nun noch im ViewModel integrieren
public interface INavigable
{
    INavigationService NavigationService { get; set; }
}
und ein Navigator im ViewModel
public static class Navigator
{
    public static INavigable GetSource(DependencyObject obj)
    {
        return (INavigable)obj.GetValue(SourceProperty);
    }
    public static void SetSource(DependencyObject obj, INavigable value)
    {
        obj.SetValue(SourceProperty, value);
    }
   public static readonly DependencyProperty SourceProperty =
        DependencyProperty.RegisterAttached("Source", typeof(INavigable), typeof(Navigator), new PropertyMetadata(OnSourceChanged));
    private static void OnSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        Page page = (Page) d;
        page.Loaded += PageLoaded;
    }
    private static void PageLoaded(object sender, RoutedEventArgs e)
    {
        Page page = (Page)sender;
        INavigable navSource = GetSource(page);
        if (navSource != null)
        {
            navSource.NavigationService = new NavigationService(page.NavigationService);
        }
    }
}
Hier noch ein wenig wie das im XAML eingesetzt wird:
<navigation:Page x:Class="SLNavigation.Page1"
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
           mc:Ignorable="d"
           xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
           xmlns:SLNavigation="clr-namespace:SLNavigation"
           d:DesignWidth="640" d:DesignHeight="480"
           Title="Page1 Page"
           SLNavigation:Navigator.Source="{Binding}"
    >
Quelle:

Augmented Reality XAML Control für WP7 und WinRT

Ich habe ja schon über Augmented Reality Theorie berichtet, aber jetzt hat Morten Nielsen in seinem Blog einen Post erstellt, wie man ein XAML Control erstellt. Das Besondere daran ist, das es nicht nur das Windows Phone unterstützt sondern auch die kommende Windows Version 8 oder besser bekannt für Entwickler Win RT.

Mit diesem Control baue ich eine Informations App für Industrieanlagen. Nun zeige ich noch einige Codeauschnitte:

<ar:ARPanel>
    <TextBlock Text="North" ar:ARPanel.Direction="0,0" />
    <TextBlock Text="East"  ar:ARPanel.Direction="0,90" />
    <TextBlock Text="South" ar:ARPanel.Direction="0,180" />
    <TextBlock Text="West"  ar:ARPanel.Direction="0,270" />
    <TextBlock Text="Up"    ar:ARPanel.Direction="90,0" />
    <TextBlock Text="Down"  ar:ARPanel.Direction="-90,0" />
</ar:ARPanel>

Abb.: AR Control Panel in Xaml

Nachfolgend noch ein Beispiel wie man den Motion Sensor in Win RT und Windows Phone gemeinsam nutzen kann.

#if WINDOWS_PHONE
    if (Microsoft.Devices.Sensors.Motion.IsSupported)
    {
        motion = new Microsoft.Devices.Sensors.Motion();
        motion.CurrentValueChanged += motion_CurrentValueChanged;
        motion.Start();
#elif WINRT
    motion = Windows.Devices.Sensors.OrientationSensor.GetDefault();
    if (motion != null)
    {
        motion.ReadingChanged += motion_CurrentValueChanged;
#endif
    }
    else
    {
        throw new InvalidOperationException("Motion sensor not supported on this device");
    }
#endif

Quellen:

Augmented Reality on Windows Phone and Windows 8 Metro style apps

 

Anbindung vom Microphone mit XNA

Für eine aktuell in Entwicklung befindliche App benötige ich das Microphone vom WP7 Handy. Mit dem Mango Update ist es ja möglich XNA und Silverlight zumischen. Einen super Post habe ich gefunden bei .net speaks. Hier wird ein Einstieg geboten wie man ganz einfach ein Micro ansprechen kann.

Windows Phone 7 - Microphone Repeater

Abb: Einfache Demo mit einem Button

Mit folgenden paar Zeilen kann das Micro eingebunden.

using Microsoft.Xna.Framework;
using
Microsoft.Xna.Framework.Audio;
using
System.IO;
using System.Windows.Threading;

Referenzen setzen.

 

Microphone mic = Microphone.Default;
byte[] data = null
;
MemoryStream audio = null;

Micro Init.

private void btnRecord_Click(object sender, RoutedEventArgs e)
{
   if (mic.State == MicrophoneState
.Stopped)
{
mic.BufferDuration = TimeSpan
.FromMilliseconds(100);
data = new byte
[mic.GetSampleSizeInBytes(mic.BufferDuration)];
audio = new MemoryStream
();
mic.Start();
      this.PageTitle.Text = „Recording…“
;
btnRecord.Content = „Stop“
;
}
   else
   {
mic.Stop();
      this.PageTitle.Text = „Playing….“
;
btnRecord.Content = „Record“
;
btnRecord.IsEnabled = false
;
PlayRecordedAudio();
      this.PageTitle.Text = „ready“
;
}
}

Schaut euch den Post mal genau an. Es ist kein großes Problem dieses in einer eigenen App einzusetzen.

Quelle:

Part 24: Windows Phone 7 – Mircophone Repeater

Audio und WP7

Einen neuen Post hat Jesse Liberty erstellt, heute geht es um das kopieren von Audiodateien auf das Isolated Storage vom Handy. Dieses ist wohlbemerkt ein Einsteiger Beispiel, aber eben wieder in gewohnt guter Qualität.

private void CopyToIsolatedStorage()
{
    using (IsolatedStorageFile storage =
        IsolatedStorageFile.GetUserStoreForApplication())
    {
        string[ ] files = new string[ ]
        {
            "Kalimba.mp3",
            "Maid with the Flaxen Hair.mp3",
            "Sleep Away.mp3"
        };
        foreach (var _fileName in files)
        {
            if (!storage.FileExists( _fileName ))
            {
                string _filePath = "Audio/" + _fileName;
                StreamResourceInfo resource =
                    Application.GetResourceStream(
                    new Uri( _filePath, UriKind.Relative ) );
                using (IsolatedStorageFileStream file =
                    storage.CreateFile( _fileName ))
                {
                    int chunkSize = 4096;
                    byte[ ] bytes = new byte[chunkSize];
                    int byteCount;
                    while ((byteCount =
                        resource.Stream.Read(
                        bytes, 0, chunkSize )) > 0)
                    {
                        file.Write( bytes, 0, byteCount );
                    }
                }
            }
        }
    }
}

Quelle :

Jesse Liberty Blog

Frisches Futter für App Designer

Eine neue Episode über Design Fragen ist beim Altmeister John Papa als Video zu finden. Dieses mal zu zum wiederholten Mal: Corrina

 

image

Es geht hauptsächlich um Wireframes und dessen Nutzung für App Developer.

Quellen:

John Papa Blog
Channel9

 

Unit Testing für Apps

Ein nicht zu unterschätzender Teil der Entwicklung sollte das Unit Testen der Funktionen einer App sein.

Wie man sowas in Silverlight und WP7.1 ab besten anstellt, wird anhand eines Beispiels auf dem Blog von

Diary of a .Net Fan …

beschrieben. Mit Hilfe vom Silverlight Unit Test Framework von Jeff Wilcox ist es möglich auch auf WP7 Unittesting konfortable zu erstellen.

addReference

ref
Abb.: Einbinden der Reference

SQL Server CE gibt Gummi… DB Engines Performance Testing

Auch wenn ich kein Freund von Statistiken bin, möchte ich auf einen Post von

Max Paulousky in seinem Blog hinweisen. Er zeigt objektiv im Vergleich wie der MS Sql Server CE 4.0 abschneidet.

Databse structure for performance tests

 

Es wird eine typische Datenbank Tabellenstruktur zur Hand genommen und verschiedene Funktionen getestet:

Windows Phone (Mango) DB Engines Performance Testing Results

Quelle:

Windows Phone (Mango) DB Engines Performance Testing

AutoCompleteBox Tutorial

Jesse Liberty hat ein gutes Tutorial über die im Windows Phone Toolkit enthaltenden AutocompleteTextbox, in seinem Blog veröffentlicht.

Dieses Tool unterstützt den User ativ beim Ausfüllenen von Datenmasken per WP7 Handy.

Mit nur einigen Zeilen Code ist eine sehr gute UI möglich, hier ein kleiner Ausschnitt:

public class WordCompletions : IEnumerable
{
    public IEnumerable AutoCompletions = new List<string>()
    {
         "Lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing", "elit", "Nullam", "felis", "dui", "gravida", "at",
         "condimentum", "eget", "mattis", "non", "est", "Duis", "porta", "ornare", "tellus", "at", "convallis", "nibh", "aliquam",
         "faucibus", "Vivamus", "molestie", "fringilla", "ullamcorper", "Aenean", "non", "diam", "eu", "sapien", "pretium", "iaculis",
         "Quisque", "at", "ante", "libero", "eu", "tincidunt", "urna", "Cras", "libero", "ligula", "hendrerit", "at", "posuere", "at",
         "tempor", "at", "nulla", "Aliquam", "feugiat", "sagittis", "dolor", "convallis", "porttitor", "neque", "commodo", "ut", "Praesent",
         "egestas", "tincidunt", "lectus", "et", "pharetra", "enim", "semper", "et", "Fusce", "placerat", "orci", "vel", "iaculis",
         "dictum", "nulla", "sem", "convallis", "nunc", "in", "viverra", "leo", "mauris", "eu", "odio", "Nullam", "et", "ultricies",
         "sapien", "Proin", "quis", "mi", "a", "sapien", "semper", "lobortis", "ut", "eget", "est", "Suspendisse", "scelerisque", "porta",
         "mattis", "In", "eleifend", "tellus", "vel", "nulla", "aliquam", "ornare", "Praesent", "tincidunt", "dui", "ut", "libero",
         "iaculis", "consequat", "Nunc", "interdum", "eleifend", "rhoncus", "Curabitur", "sollicitudin", "nulla", "sagittis", "quam",
         "vehicula", "cursus", "Fusce", "laoreet", "arcu", "vitae", "fringilla", "scelerisque", "nisi", "purus", "laoreet", "ipsum", "id",
         "suscipit", "erat", "tellus", "eu", "sapien", "Proin", "pharetra", "tortor", "nisl", "Etiam", "et", "risus", "eget", "lectus",
         "vulputate", "dignissim", "ac","sed", "erat", "Nulla", "vel", "condimentum", "nunc", "Suspendisse", "aliquam", "euismod", "dictum",
         "Ut", "arcu", "enim", "consectetur", "at", "rhoncus", "at", "porta", "ut", "lacus", "Donec", "nisi", "quam", "faucibus", "tempor",
         "tincidunt", "eu", "porttitor", "id", "ipsum", "Proin", "nec", "neque", "nulla", "Suspendisse", "sapien", "metus", "aliquam", "nec",
         "dapibus", "consequat", "rutrum", "id", "leo", "Donec", "ac", "fermentum", "tortor", "Pellentesque", "nisl", "orci", "tincidunt",
         "at", "iaculis", "vitae", "consequat", "scelerisque", "ante", "Suspendisse", "potenti", "Maecenas", "auctor", "justo", "a", "nibh",
         "sagittis", "facilisis", "Phasellus", "ultrices", "lectus", "a", "nisl", "pretium", "accumsan"
    };
    public IEnumerator GetEnumerator()
    {
        return AutoCompletions.GetEnumerator();
    }
}
Eingebunden wird dieses Tool über diesen Namespace:
xmlns:data="clr-namespace:AutoCompleteData"
Quelle:
 

Mango auf dem Index,

oder wie man mit dem SQL Server CE 4.0 richtig mit dem Index umgeht.

Auf devlicio.us/blogs/derik_whittaker ist mal wieder ein weiterer Beitrag erschienen wie Index Columns erstellt werden. Dieser Post ist der dritte in diesem Get Started Tutorial.

[Index(Columns = „Name“, Name = „i_Name“)]
[Index(Columns = „Name, Number“, Name = „i_Name_Number“)]
[Table]
public class Episode
{
    // blah, blah, blah
}

Also man muss zugeben dieses Erstellen ist wirklich sehr einfach und bekommt jeder Entwickler hin.

Quelle:

Using SQL CE On WP7 Mango–Working with Indexes