Archive | Juli 2011

MVVM und deren Übersetzung

Ein Thema das ich auch in meiner App Entwicklung schon mehrfach hatte lautet Mehrsprachigkeit einer App.

Grundsätzlich ist es lösbar, aber einen neuen besseren Ansatz habe ich jetzt bei Joost van Schaik auf seinen Blog gefunden. Er hat einen anderen Ansatz als ich, und ich muss gestehen ich werde umdenken müssen und man sieht wieder, man lernt nie aus.

using System;
using GalaSoft.MvvmLight;

namespace Wp7nl.Globalization
{
  /// <summary>
  /// Supported languages
  /// </summary>
  public class Language : ViewModelBase, IEquatable<Language>
  {
    private string locale;
    public string Locale
    {
      get { return locale; }
      set
      {
        if (locale != value)
        {
          locale = value;
          RaisePropertyChanged(() => Locale);
        }
      }
    }

Quelle:

MVVMLight based language selection for Windows Phone 7

Refactoring MVVM inclusive IoC Part 1

Ich habe schon viele Apps mit MVVM erstellt, Aber auf dem Blog von Kelly Sommers Kellabyte, habe ich einen extrem guten Post gefunden wie man seine MVVM Logik durch Refactoring sinnvoll umbaut und somit eine bessere Logik für seinen MVVM aufsetzt.

Dieser Post besteht aus 3 Teilen:

  • Part 2: ViewModelResolver, composition root and encapsulating the IoC container
  • Part 3: Handling special cases like late registrations outside the composition root
  • Part 4: Unit testing

Before

01 public TViewModel ViewModel
02 {
03     get
04     {
05         TViewModel viewModel;
06         bool wasCreated;
07         bool designMode = DetectDesignMode();
08
09         if (designMode)
10         {
11             viewModel = new TDesignViewModel();
12             wasCreated = true;
13         }
14         else
15         {
16             if (shareInstances)
17             {
18                 viewModel = (TViewModel)sharedInstances.CreateOrGetValue(
19                                 typeof(TViewModel),
20                                 () => new TViewModel(), out wasCreated);
21             }
22             else
23             {
24                 viewModel = new TViewModel();
25                 wasCreated = true;
26             }
27         }
28
29         viewModel.OnLocated(wasCreated);
30         return viewModel;
31     }
32 }

 

After

01 public TViewModel ViewModel
02 {
03     get
04     {
05         TViewModel viewModel;
06         bool designMode = DetectDesignMode();
07
08         if (designMode)
09         {
10             // At design time instantiate design time version.
11             // This populates mock data, dependencies don't have to be real.
12             viewModel = new TDesignViewModel();
13         }
14         else
15         {
16             // Request IoC container to resolve view model & its deps.
17             viewModel =
18                 ApplicationHost.Current.Container.Resolve<TViewModel>();
19         }
20
21         viewModel.OnLocated(wasCreated);
22         return viewModel;
23     }
24 }

 

Quelle:

Refactoring to improve maintainability and blendability using IoC part 1: View Models

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

Sockets Tutorial für WP7 Mango

Nachdem Microsoft vieles versäumt hat in der jetztigen Version von WP7, halten mit dem Mango Update 2 nun auch die Sockets wieder Einzug ins Phone 7.

Da ich gerade an einem App arbeite wo Sockets unbedingt notwendig sind, kommt mir der Post über Sockets auf WindowsPhone Geek gerade recht. Hier wird eine Demo App vorgestellt, die Files senden und empfangen kann.

Command Process Flow

Abb. : Process Flow der App

Die Daten werden mit JSON (De)/Serialisiert, was mit folgenden 2 Functions schnell implementiert ist:

private static string Serialize(object objectToSerialize)
{
    using (MemoryStream ms = new MemoryStream())
    {
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(objectToSerialize.GetType());
        serializer.WriteObject(ms, objectToSerialize);
        ms.Position = 0;
        using (StreamReader reader = new StreamReader(ms))
        {
            return reader.ReadToEnd();
        }
    }
}
private static T Deserialize<T>(string jsonString)
{
    using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonString)))
    {
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
        return (T)serializer.ReadObject(ms);
    }
}
Das Resultat der App wird in einer Pivot Anzeige demonstriert.
SettingsGetDirectoryServerChatter
Quelle:

Geo Service Bing Service Wrapper

Auf dem  Xaml Ninja Blog ist ein genialer Post erschienen wir der Developer eine Wrapperclass erstellt mit WP7 Contrib. Richtig ins Detail gehts tief in die Entwicklung und saubere Abwicklung von Problemen wie Logging, und MVVM  deren Erstellung.

Aufbau eines ViewModels inclusive Services:

First up we need to declare the private fields so let’s go ahead and do that

01.private readonly IBingMapService bingMapService;
02.private readonly ILocationService locationService;
03.private LocationRect boundingRectangle;
04.private GeoCoordinate currentDeviceGeoCoordinate;
05.private IDisposable currentLocationObserver;
06.private RelayCommand selectFindMyCurrentLocationCommand;
07.private RelayCommand selectFindGeoLocationFromAddressCommand;
08.private Address address;
09.private LocationData locationDataByPoint;
Constuctor des VM:
01.public LocationViewModel(
02.INavigationService navigationService,
03.ILocationService locationService,
04.IBingMapService bingMapService,
05.ILog log)
06.: base(navigationService, log)
07.{
08.this.locationService = locationService;
09.this.bingMapService = bingMapService;
10.this.address = new Address {CountryRegion = "UK", PostalCode = "LE17 5ER"};
11.}
Diese Post ist zu aufwändig das ich ihn in seiner Gesamtheit dastellen kann.
Quelle:

SkyDrive Photo API in WP7

Hotmail

SkyDrive Dienste sind ja Online Storages und Sharing Services von Microsoft. Um diese sinnvoll zu nutzen, benötigt der User eine LiveId , was bei WP7 Phone Besitzern ja kein Problem aufwirft.

Verfügbar sind schon für Developer SkyDrive .NET API Client auf Codeplex und nun ganz Neu und Hip ein Beispiel wie man Photos per API Verwaltet und in WP7 dafür entwickelt.

/// <summary>          /// The URI for the OAuth service’s Authorize endpoint.          /// </summary>          private static readonly string OAuthAuthorizeUri = „https://oauth.live.com/authorize&#8220;;        /// <summary>   /// Build the OAuth URI.   /// </summary>   /// <param name=“scopes“>The requested scopes.</param>   /// <returns>The OAuth URI.</returns>   private Uri BuildOAuthUri(string[] scopes)          {              List<string> paramList = new List<string>();              paramList.Add(„client_id=“ + HttpUtility.UrlEncode(MainPage.ClientId));              paramList.Add(„scope=“ + HttpUtility.UrlEncode(String.Join(“ „, scopes)));              paramList.Add(„response_type=“ + HttpUtility.UrlEncode(„token“));              paramList.Add(„display=“ + HttpUtility.UrlEncode(„touch“));              paramList.Add(„redirect_uri=“ + HttpUtility.UrlEncode(MainPage.RedirectUri));                UriBuilder authorizeUri = new UriBuilder(MainPage.OAuthAuthorizeUri);              authorizeUri.Query = String.Join(„&“, paramList.ToArray());              return authorizeUri.Uri;          }    /// <summary>  /// Launch the OAuth flow.  /// </summary>  private void LaunchOAuthFlow()          {              this.loadingGrid.Visibility = Visibility.Visible;              this.authorizationBrowser.Navigating += this.OnAuthorizationBrowserNavigating;              this.authorizationBrowser.Navigated += this.OnAuthorizationBrowserNavigated;              this.authorizationBrowser.Navigate(this.BuildOAuthUri(this.scopes));          }

Quelle:

 
SkyDrive .Net API Client
SkyDrive Photo API sample for WP7
 

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

 

Website für Mobile Devices

Im MSDN Magazine ist ein Post erschienen wie ein Webdesigner seine bestehenden Website umstellen kann, um Sie für das Browsen auf mobilen Devices perfekt anzupassen.

A Mobile Browser Rendering a Desktop-Width Page onto a Virtual Viewport

Es wird auch per HTML beschrieben wie Viewports angesteuert werden um ein maximalen Ergebnis zu erreichen.

Quelle:

Build a Better Mobile Browsing Experience

Export Sql CE Server Database File

Mit dem Mango Update kommt ein nicht zu unterschätzendes Tool in die Hände eines Entwicklers.

Der Isolated Storage Explorer, mit diesem Tool kann man z.b. ein Backup von eine Datenbank machen und dieses File exportieren. Wie dieses gemacht wir zeigt Derik Whittaker, auf seinem Blog devlicio.us/blogs/derik_whittaker.

In vier Schritten wird ausführlich gezeigt wie eine Datenbank export werden kann.

Da dieses Tool leider noch ein Kommandozeilen Tool ist, werden die Parameter besprochen und wie folgt demonstriert.

image

 

image

Quelle:

Using the Isolated Storage Explorer tool on WP7 Mango to export your .sdf file