Archive | November 2011

Windows Phone Starter Kit for Schools

Microsoft hat ein neues Startkit für Schulen auf MSDN eingestellt. Hier soll interessierten Schülern der Einstieg in die Programmierung von Apps für die Windows Phone Plattform schmackhaft gemacht werden.

Abb; Schul App Beispiel

Ganz einfach  wird anhand eines App für eine Schule beschrieben wie eine App entwickelt werden kann. Da sollten sich die Herren der Apfel und Android  Fraktion mal ein Beispiel dran nehmen.

Quelle:

MSDN

Advertisements

Codesnippets für MVVM RelayCommand

Wer viel mit dem Galasoft MVVM Light Framework arbeitet kann sich die Arbeit mit Commands vereinfachen. Jan Hannemann hat auf seinem Blog einen Post erstellt mit Codesnippets für eben diese Definition von RelayCommands.

<?xml version="1.0" encoding="utf-8" ?>
 2: <CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
 3: <CodeSnippet Format="1.0.0">
 4: <Header>
 5: <Title>RelayCommand</Title>
 6: <Shortcut>relaycmd</Shortcut>
 7: <Description>Define a RelayCommand</Description>
 8: <Author>Jan Hannemann</Author>
 9: <SnippetTypes>
 10: <SnippetType>Expansion</SnippetType>
 11: </SnippetTypes>
 12: </Header>
 13: <Snippet>
 14: <Declarations>
 15: <Literal>
 16: <ID>CMD</ID>
 17: <ToolTip>Command Property</ToolTip>
 18: <Default>Command</Default>
 19: </Literal>
 20: <Literal>
 21: <ID>CMDF</ID>
 22: <ToolTip>Command Field</ToolTip>
 23: <Default>command</Default>
 24: </Literal>
 25: </Declarations>
 26: <Code Language="csharp">
 27: <![CDATA[
 28: private RelayCommand _$CMDF$;
 29: public RelayCommand $CMD$
 30: {
 31: get
 32: {
 33: return _$CMDF$;
 34: }
 35: }
 36:
 37: /// <summary>
 38: /// Checks whether the $CMD$ command is executable
 39: /// </summary>
 40: private bool Can$CMD$()
 41: {
 42: return true;
 43: }
 44:
 45: /// <summary>
 46: /// Executes the $CMD$ command 
 47: /// </summary>
 48: private void Exec$CMD$()
 49: {
 50: throw new NotImplementedException();
 51: }
 52:
 53: //cut and paste this line to your ctor
 54: _$CMDF$ = new RelayCommand(Exec$CMD$, Can$CMD$);
 55: $end$]]>
 56: </Code>
 57: </Snippet>
 58: </CodeSnippet>
 59: </CodeSnippets>

Diese Codesnippets erleichtern die tägliche Arbeit doch ein wenig, und das Leben des Entwicklers wird wieder etwas schöner.

Quelle:

Bitdisaster

 

App Verkaufswebsite Template

Auf Codeplex ist ein neues Projekt eingestellt worden. Es handelt sich um ein Websitetemplate für den Verkauf von Apps.

Hier ist alles vorhanden, damit das Marketing für seine App sofort starten kann. Der Developer muss nur noch eigene Bilder und Text und Links eintragen.

Abb.: Demo Template Site

Diese Arbeit kann auch von nicht Webdesigner leicht ausgeführt werden.

Quelle:

Codeplex Projekt

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

Bing Maps Pushpin Optimierung

Über das Bing Maps Control in WP7 habe ich ja schon einige Posts geschrieben, heute geht es darum ein Clustering Pattern für Mengen von Pins zu erstellen.

Colin Eberhardt von ScottLogic hat in einem Post dieses Problem angegangen und dokumentiert.

Über eine Container Pattern Class wird diese Funktion implementiert.

// <summary> 
/// Clusters the given pins on the supplied map 
/// </summary> 
public PushpinClusterer(Map map, List<Pushpin> pins, DataTemplate clusterTemplate) 
{ _map = map; _pins = pins; ClusterTemplate = clusterTemplate;   _map.ViewChangeEnd += (s, e) => RenderPins(); }     
/// <summary> /// Re-render the pushpins based on the current zoom level /// </summary> 
private void RenderPins() 
{ List<PushpinContainer> pinsToAdd = new List<PushpinContainer>();   
// consider each pin in turn foreach (var pin in _pins) 
{ var newPinContainer = new PushpinContainer(pin, _map.LocationToViewportPoint(pin.Location));
   bool addNewPin = true;   
// determine how close they are to existing pins foreach(var pinContainer in pinsToAdd) 
{ double distance = ComputeDistance(pinContainer.ScreenLocation, newPinContainer.ScreenLocation);   
// if the distance threshold is exceeded, do not add this pin, instead // add it to a cluster 
if (distance < DistanceThreshold) { pinContainer.Merge(newPinContainer); addNewPin = false; break; } }   
if (addNewPin) { pinsToAdd.Add(newPinContainer); } }   
// asynchronously update the map 
_map.Dispatcher.BeginInvoke(() => { _map.Children.Clear(); 
foreach (var projectedPin in pinsToAdd.Where(pin => PointIsVisibleInMap(pin.ScreenLocation, _map))) 
{ _map.Children.Add(projectedPin.GetElement(ClusterTemplate)); } });   
}   

Abb.: Auszug Quellcode

Falls Ihr solche Problematik auch habt dann sollte der Post auch sehr interessieren.

Quelle:

Pushpin Clustering with the Windows Phone 7 Bing Map control

Die Mango App, Microsofts Referenz App

Wie eine moderne App im Mangostyle inklusive Sql Server CE 4.0 Anbindung erstellt wird, hat jetzt das MSDN Magazin in einem Beitrag dagestellt.

Mangolicious Panorama Main Page

Abb.: App für Rezepte und Coktails

Um eine App noch aufzuwerten, ist ein XNA Spiel mit ins App integriert. Dieses ist wirklich eine super Idee und steigert sicher den Benutzerwert eine App. Weil fast jeder Smartphone Nutzter ein kleinen Spielsinn hat.

Hier noch ein Code Snippet wie die Datenbank eingebunden wurde.

public class MangoDataContext : DataContext 
{   public MangoDataContext()     : base("Data Source=isostore:/Mangolicious.sdf") { }     
 public Table<Recipe> Recipes;
   public Table<Fact> Facts;
   public Table<Cocktail> Cocktails; 
}

Hier noch eine Abbildung vom XNA Game.

The XNA Game in Progress

Quelle:

Building a ‚Mango‘ App

Raster & Marker in der Bing Maps

Wer eine App mit Bing Maps plant und nicht so recht weiß wie man Marker und Raster in eine Map integriert, findet eine ganze Reihe von Posts über dieses Thema.

Abb.: Verschiedene Raster auf einer Bing Map

Diese Post sind auf dem Blog von Awkward Coder zu finden. Mit Hilfe von einer Shape Class und einem Template können solche Effekte erstellt werden.

Quelle:

Tessellating shapes on top of Bing Maps in a WP7 app

WP7 Cam als Backround Behavior

Eine nette Idee hatte Joost van Schaik, er hat ein Behavior geschrieben damit die Cam im Phone als Backround Video Streaming genutzt werden kann.

/// A behavior that shows a camera view on the background of a panel
  /// </summary>
  public class CameraViewBackgroundBehavior : Behavior<Panel>
  {
    private PhotoCamera camera;
    private PhoneApplicationFrame parentPage;
    private Uri pageSource;
    private VideoBrush backgroundBrush;

    // Setup and cleanup according to http://bit.ly/dZb6D9

    #region Setup
    protected override void OnAttached()
    {
      base.OnAttached();
      AssociatedObject.Loaded += AssociatedObjectLoaded;
      AssociatedObject.Unloaded += AssociatedObjectUnloaded;
    }
private void AssociatedObjectLoaded(object sender, RoutedEventArgs e)
    {
      DoInit();
    }
    #endregion

    #region Cleanup
    private bool isCleanedUp;

    private void Cleanup()
    {
      if (!isCleanedUp)
      {
        isCleanedUp = true;
        AssociatedObject.Loaded -= AssociatedObjectLoaded;
        AssociatedObject.Unloaded -= AssociatedObjectUnloaded;
        DoCleanup();
      }
    }

    protected override void OnDetaching()
    {
      Cleanup();
      base.OnDetaching();
    }

    private void AssociatedObjectUnloaded(object sender, RoutedEventArgs e)
    {
      Cleanup();
    }
    #endregion
  }

Quelle :

A behavior to show the Windows Phone 7 camera as background

Google Analytics für WP7 Apps

Ich habe einen coolen Post mal wieder gefunden, über den Einsatz von Google Analytics und dem Silverlight Analytics Framework .

image

Abb.: Analyse von App Nutzungen

Mit etwas Aufwand ist dieses Framework schnell in die eigene App eingebaut.  Nach dem Download der Tools müssen als erstes die Referenzen gesetzt werden.

  • Microsoft.WebAnalytics.dll
  • Microsoft.WebAnalytics.Behaviors.dll
  • System.ComponentModel.Composition.dll
  • System.ComponentModel.Composition.Initialization.dll
  • System.Windows.Interactivity.dll

Also nächtes sollte dich der Developer einen Google Analytics Account anlegen und einen sogenannten WebPropertyId von Google besorgen. Danach noch die einige Zeilen Code und das Tool ist fertig eingebaut.

public class AnalyticsService : IApplicationService
{
    private readonly IApplicationService _innerService;
    private readonly GoogleAnalytics _googleAnalytics;
    public AnalyticsService()
    {
        _googleAnalytics = new GoogleAnalytics();
        _googleAnalytics.CustomVariables.Add(new PropertyValue { PropertyName = "Device ID", Value = AnalyticsProperties.DeviceId });
        _googleAnalytics.CustomVariables.Add(new PropertyValue { PropertyName = "Application Version", Value = AnalyticsProperties.ApplicationVersion });
        _googleAnalytics.CustomVariables.Add(new PropertyValue { PropertyName = "Device OS", Value = AnalyticsProperties.OsVersion });
        _googleAnalytics.CustomVariables.Add(new PropertyValue { PropertyName = "Device", Value = AnalyticsProperties.Device });
        _innerService = new WebAnalyticsService
                            {
                                IsPageTrackingEnabled = false,
                                Services = { _googleAnalytics, }
                            };
    }
    public string WebPropertyId
    {
        get { return _googleAnalytics.WebPropertyId; }
        set { _googleAnalytics.WebPropertyId = value; }
    }
    #region IApplicationService Members
    public void StartService(ApplicationServiceContext context)
    {
        CompositionHost.Initialize(
            new AssemblyCatalog(
                Application.Current.GetType().Assembly),
            new AssemblyCatalog(typeof(AnalyticsEvent).Assembly),
            new AssemblyCatalog(typeof(TrackAction).Assembly));
        _innerService.StartService(context);
    }
    public void StopService()
    {
        _innerService.StopService();
    }
    #endregion
}
Also Beispiel Tracker wird unter Einsatz von MEF, dieser wie folgt implementiert:
public class AnalyticsTracker
{
    public AnalyticsTracker()
    {
        CompositionInitializer.SatisfyImports(this);
    }
    [Import("Log")]
    public Action<AnalyticsEvent> Log { get; set; }
    public void Track(string category, string name)
    {
        Track(category, name, null);
    }
    public void Track(string category, string name, string actionValue)
    {
        Log(new AnalyticsEvent { Category = category, Name = name, ObjectName = actionValue });
    }
}
Diese Analyse sollte man als App Entwickler unbedingt nutzen um die App noch zu verbessern und welche Funktionen den meisten Traffic haben.
Quelle: