Kategorie-Archiv: wp7dev

WPDev Fusion: Recordings, Slides and Samples are now available!

Last Wednesday was a special day, after weeks of preparation the first WPDev Fusion kicked off a new initiative with a huge success. With live attendees from all over the world, hundreds of tweets on our #wpdevfusion hashtag and great sessions by our top speakers we couldn’t have imagined a better start. After the success of Windows Phone Week in October we realized something bigger and longer-lasting should be available for our beloved #wpdev community. This event was the first step towards the WPDev Fusion community the will be organizing events and hosting content online throughout 2014 and beyond.

We are well aware that not everyone has been able to attend the full event and therefore we are happy to announce the availability of recordings, slides and samples for every WPDev Fusion session. See the bottom of this post for an overview.

Did you like the event? Do you have feedback about the event or any of the sessions? Or do you have any suggestions about the future of our community? Please let us know! Also don’t forget to follow us on Twitter and Facebook to stay up to date our future plans and announcements.

Thanks again to everyone for being part of this event, enjoy the recordings and slides and we hope to welcome you back to a WPDev Fusion event in the future.

Session recordings are available through the online portal. Please login using the emailaddress used for registering before or perform a new registration.

Utilizing the Speech API – Maciej Grabek

Is there any other way to establish communication between user and app different to graphical user interface and touch? Yes… there is… Instead of normal interaction we can simply TALK with our app. What more is that our app can talk to us! This gives you lot of new possibilities and WOW factor. Join this presentation to learn more how to surprise users of your app.

SlidesDemos

Local data access in Windows Phone – Matteo Pagani

One of the most common requirements in a Windows Phone app is to store data locally, so that they can be accessed also when the Internet connection is missing. During this session we’ll see the available solutions: local storage, serialization and databases.

Slides - Demos

Mapping Tips and Tricks – Joost van Schaik

Windows Phone has a very exciting and versatile set of APIs around maps, location and routing. This session takes you on a short roundtrip through the features and ends with some real GIS integration
Basic Map manipulation & querying
Drawing and querying points on the map
Drawing and querying lines/polygons on the map
Integrate with routing
Basic proximity detection using Location tracking

SlidesDemos

An App – No Code: The Microsoft App Studio – Peter Nowak

With Microsoft App Studio it is finally possible to create Apps without developer knowledge. There are some basics to learn. What these are and what you need to know is shown in this session.

Slides

Sharing Data between W8 and WP8: SkyDrive for developers

Users love being able to share data between apps on Windows 8 and Windows Phone. This session shows you how to use SkyDrive to share data between platforms as well as encryption techniques.

SlidesDemos

Ask the experts

A full 30 minute “Ask the experts”-session with our speakers: Peter Nowak, Maciej Grabek, Ginny Caughey, Matteo Pagani and Joost van Schaik to wrap up the event.

(This article was originally published under http://www.wpdevfusion.com/2014/01/recordings-slides-and-samples-are-now-available/#blog)

Filtern von Daten in Windows Phone bei Nutzung von MVVM

Im deutschen MDSN Forum für Windows Phone wurde diese Frage gestellt, wie man Daten filtern kann, wenn MVVM eingesetzt wird.

Die kurze Antwort dazu lautet: Mit einer CollectionViewSource.

Die lange Antwort zeige ich in einem Sample, da die Umsetzung für Einsteiger nicht ganz so einfach zu erkennen ist.

MVVM besteht ja aus den Komponenten View (also der UI), dem Model (also den Daten) und dem ViewModel das die View mit dem Model koppelt. Das geschieht mittels Datenbindung, in welcher das ViewModel als Datenkontext für die UI dient. Daran ändert sich nichts. Zum Filtern oder Sortieren von Daten setzt man hingegen eine CollectionViewSource ein. Anstatt die Daten über das ViewModel an die View zu koppeln, wird zwischen die zu filternden Daten eine CollectionViewSource gesetzt, in der dann die Daten gefiltert werden können. So ist die Verbindung also in diesem speziellen Fall, dass Teile der View an die CollectionViewSource gebunden werden, welche im ViewModel deklariert ist.

Das klingt jedoch ein wenig abstrakt, weswegen ein Beispiel das ein wenig verdeutlichen soll.

In diesem werden Autoreninformationen bestehend aus Vorname und Nachname des Autoren und des darüber hinaus geschriebenen Buches dargestellt. Letzteres ist nicht ganz korrekt, aber der Einfachheit halber sei dies so definiert, dass ein Autor nur ein Buch hat.

Das Filterkriterium soll hier der Vorname des Autors sein. Natürlich ließe sich das auch noch wesentlich komplizierter auf den ganzen Autor anwenden, aber das soll für dieses simple Beispiel einfach einmal reichen.

Die Oberfläche der App ist simpel.

wp_ss_20130618_0001

In einer ListBox werden die Informationen zu den Autoren und ihrem Buch angezeigt. (Wieso dies nur mit einer ListBox geht, erkläre ich später.) Das Texteingabefeld ist zur Definition des Filters und die Schaltfläche dient zum Setzen des Filters. Man könnte dies auch vereinfachen indem man auf das Ereignis reagiert, wenn im Textfeld etwas eingegeben wird, aber das soll erst einmal auch hier keine Rolle spielen.

Das Model sieht für den Autor wie folgt aus.

using DataFilterPhoneApp.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DataFilterPhoneApp.Model
{
    public class Author: BindableBase
    {
        private string _name;
        public string LastName
        {
            get { return _name; }
            set { SetProperty(ref _name, value); }
        }
        private string _firstname;
        public string FirstName
        {
            get { return _firstname; }
            set { SetProperty(ref _firstname, value); }
        }
        private string _book;
        public string Book
        {
            get { return _book; }
            set { SetProperty(ref _book, value); }
        }

    }
}

Die Klasse ist selbsterklärend, weswegen nicht weiter darauf eingegangen wird. Lediglich ein Verweis auf diesen Artikel wird gegeben, in welchem ich bereits die BindableBase erklärt habe. Diese wird in diesem Projekt ebenfalls verwendet,

Das ViewModel beinhaltet die Filterungslogik.

using DataFilterPhoneApp.Common;
using DataFilterPhoneApp.Model;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;

namespace DataFilterPhoneApp.ViewModel
{
    public class MainPageViewModel:BindableBase, IMainPageViewModel
    {

        private readonly ObservableCollection<Author> _authors;
        private readonly CollectionViewSource _viewSource;
        public DelegateCommand FilterCommand { get; private set; }

        public MainPageViewModel()
        {
            _authors = new ObservableCollection<Author> ();
            //Build Sample Data
            _authors.Add(new Author { FirstName = "Peter", LastName = "Nowak", Book = "Entwickeln für Windows Phone 7.5" });
            _authors.Add(new Author { FirstName = "Patrick", LastName = "Getzmann", Book = "Entwickeln für Windows Phone 7.5" });
            _authors.Add(new Author { FirstName = "Simon", LastName = "Hackfort", Book = "Entwickeln für Windows Phone 7.5" });
            _viewSource = new CollectionViewSource();
            _viewSource.Source = _authors;
            FilterCommand = new DelegateCommand(FilterAuthorsByFirstName);
        }
        private String _filterText;
        public String FilterText
        {
            get { return _filterText; }
            set { SetProperty(ref _filterText, value); }
        }
        public ObservableCollection<Author> Authors
        {
            get { return _authors; }
        }
        public CollectionViewSource ViewSource
        {
            get { return _viewSource; }
        }
        private void FilterAuthorsByFirstName()
        {
            if (FilterText == null)
                return;
            ViewSource.View.Filter = o =>
            {
                var item = o as Author;
                if (item != null)
                {
                    return item.FirstName.Contains(FilterText);
                }
                return false;
            };
        }
    }
}

 

Auch hier wird eine ObservableCollection deklariert, in welcher die Informationen zu den Autoren hinterlegt werden. Zusätzlich wird ein Objekt vom Typ CollectionViewSource deklariert, durch welches die Daten später gefiltert werden. Zusätzlich gibt es DelegateCommand, durch welches das Filtern ausgelöst werden soll. Dazu gleich mehr.

Im Konstruktor ist der typische Aufbau der Autorendaten zu sehen. Diese werden als Datenquelle an die Eigenschaft Source der CollectionViewSource übergeben.

Die Methode FilterAuthorByFirstName ist die erstellte Filtermethode. So wird in dieser eine anonyme Methode erstellt, in welcher auf die Autoreninformationen zugegriffen wird und die Filterung stattfindet. Diese anonyme Methode wird an die Eigenschaft von Filter übergeben. Was bedeutet das aber nun?

Wie Sie richtig vermuten wird das Filtern nur in der Ansicht der CollectionViewSource durchgeführt. Das unterliegende Element, also die ObservableCollection bleibt hiervon völlig unangetastet. Man könnte also auch mehrere Instanzen der CollectionViewSource verwenden, die auf die selben Quelldaten zugreifen, aber jeweils nur einen Ausschnitt der Gesamtdaten darstellt.

Was nun noch fehlt ist die MainPage. Der Quellcode dieser Seite beinhaltet keine Zeile zusätzlichen Code, da alles benötigte in der XAML Deklaration abgelegt wurde..

<phone:PhoneApplicationPage
    x:Class="DataFilterPhoneApp.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:viewModels="clr-namespace:DataFilterPhoneApp.ViewModel"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    shell:SystemTray.IsVisible="True">
    <phone:PhoneApplicationPage.DataContext>
        <viewModels:MainPageViewModel x:Name="MainPageViewModel"/>
    </phone:PhoneApplicationPage.DataContext>

...

        <!--ContentPanel - place additional content here-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <TextBox x:Name="txtFilter" Text="{Binding FilterText, Mode=TwoWay}" HorizontalAlignment="Left" Height="81" Margin="10,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="446"/>
            <ListBox x:Name="lls" HorizontalAlignment="Left" Height="414" Margin="10,183,0,0" VerticalAlignment="Top" Width="436" 
                     ItemsSource="{Binding ViewSource.View}"
                                    >
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Margin="0,0,0,20">
                            <TextBlock Text="{Binding FirstName}"/>
                            <TextBlock Text="{Binding LastName}"/>
                            <TextBlock Text="{Binding Book}"/>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>

            </ListBox>
        </Grid>
        <Button x:Name="btnFilter" Command="{Binding FilterCommand}" Content="Filter Firstname" HorizontalAlignment="Left" Margin="12,96,0,0" Grid.Row="1" VerticalAlignment="Top" Width="456"/>
    </Grid>

</phone:PhoneApplicationPage>

Wie man sieht ist bei der Seitendeklaration ein XML-Namensraum für das ViewModel deklariert, so das die Deklaration des ViewModel für die Eigenschaft DataContext ebenfalls in XAML direkt erfolgen kann. Man benötigt also keine Zeile Quellcode dazu.

In der Deklaration des Textfelds und der Schaltfläche werden das Kommando und die zeichenfolge aus dem ViewModel gebunden. In der ListBox wird das DataTemplate definiert, in welchem die Informationen der Autoren dargestellt werden sollen. Die Datenquelle für die ListBox hingegen ist die ViewSourceView anstatt Authors. Somit ist die CollectionViewSource zum Filtern der Daten bereit.

Hoffentlich war dieses Beispiel einleuchtend. Leider ist der Einsatz der CollectionViewSource primär nur mit der ListBox möglich. Für den LongListSelector ist noch ein wenig mehr Arbeit nötig, da diese beiden Elemente erst einmal nicht kompatibel miteinander sind. Dazu jedoch in einem folgenden Blogpost mehr.

Das Sample gibt es als Quellcode hier:

Mobile Developer’s Guide To The Galaxy 9th Edition erschienen

Wer weiß schon alles über Mobile Entwicklung? Wer hat eigentlich einen guten Überblick?

Diese Informationen stellt der englischsprachige Guide zur Verfügung, welcher u.a. kostenlos als PDF geladen werden kann. Patrick und ich durften zu Windows Phone ein bisschen was beisteuern.

Hier die offizielle Beschreibung zum Guide:

“This non-commercial brochure provides an overview on the different mobile technologies and platforms. Almost 20 writers contributed their know-how and outline their views on the pros and cons of different operation systems and development approaches. Together with the Wireless Industry Partnership (WIP), we started this project in 2009. The current 9th edition has been presented in October 2011 and consists of 180 pages”

Mehr Informationen zum Guide, wie auch den Guide selbst gibt es hier.

LG Optimus E-900 zu gewinnen!

Soeben erreichte mich folgende E-Mail von Peter Freeman Foot, WPD MVP Kollegen aus Neuseeland, mit der Bitte um Mitteilung:

Hi all,
LG has been kind enough to give us an LG Optimus E-900 device as a prize for
our contest and we would like to spread the word to all budding WP7
Developers/Designers. The contest is open to entries from all countries and
runs until 18th February. Please pass on the details to your communities:-
http://appamundi.com/win-a-windows-phone-7-lg-e900/
Thanks,
Peter

Wer also Interesse hat – mitmachen!

WP7: 90 MB künstliches Speicherlimit – ein kleines modernes Märchen

Laut den Zertifizierungsrichtlinien (5.2.5 Memory Consumtion) für WP7 Anwendungen dürfen Anwendungen nicht mehr als 90 MB RAM nutzen, wenn der Hauptspeicher weniger als 256 MB physischen RAM besitzt.

Dies löste in Vergangenheit eine kleine “Panik” aus, dass derlei Anwendungen nicht zertifiziert würden. Das ist jedoch falsch – Geräte mit weniger als 256 MB RAM stellen diese Anwendung laut Microsoft nicht im Marketplace dar.

Im Umkehrschluss gibt es jedoch faktisch kein Gerät, welches über weniger als 256 MB RAM verfügt. Ergo tritt dieser Fall nicht ein.

Hinweis: Man sollte immer seine Anwendung auf Performance- und Speicherverbrauch optimieren. Das sollte nicht vernachlässigt werden. Lediglich ein künstliches herunterschrauben auf unter 90 MB Speicherverbrauch sind unnötig.

MSDN on Tour: 3.2. in Mülheim – Meet & Greet

Seit einigen Tagen tourt der MSDN Bus mit interessanten Vorträgen und Personen durch Deutschland. Am 3.2. macht der Bus halt in Mülheim (Achtung – die Veranstaltung beginnt bereits um 17 Uhr).

Aufgrund der Ortsnähe haben wir uns kurzfristig dazu entschieden ein kleines “Meet & Greet” zu veranstalten. Simon Hackfort, Patrick Getzmann und meine Wenigkeit werden somit vor Ort sein um unser aktuelles Buch zu signieren, wie auch ein paar interessante Gespräche über Windows Phone 7 zu führen.

Hier somit die Details noch in Kürze:

Wo: .net Usergroup
Ort: Mülheim an der Ruhr
PLZ: 45475
Straße: Schultenhofstr. 19-23
Zeit: 17.00 – 22.00 Uhr

Online: Das kostenlose Windows Phone 7 eBook "Erste Schritte mit dem Phone" als WP7 App

Das kostenlose Windows Phone 7 eBook “Erste Schritte mit dem Phone” von Andreas Erle, meinem geschätzten Windows Phone MVP Kollegen, kann ab sofort (wenn auch noch nicht in der Suche zu finden) unter diesem Link heruntergeladen werden: zune://navigate/?appID=528ed186-a6fe-df11-9264-00237de2db9e

Wieso ist dies erwähnenswert, wo es doch so viele Apps gibt, die erscheinen?
Nicht nur der Inhalt ist Klasse, sondern es ist einfach Fakt, dass es so gesehen “meine” erste App ist, die entwickelt wurde. Dabei ist klar, dass es noch Verbesserungspotential gibt, aber für die Zeit, in welcher es entwickelt wurde ist es super.
Vielen Dank nochmal an Patrick Getzmann, Tim Schmitz und Sebastian Jäger, die hierbei unterstützt haben.

Windows Phone 7 Trainings zum Nulltarif

Unter dem Motto “Windows Phone 7 Quickstart für Entwickler” veranstaltet Microsoft im Januar und Februar 2011 eine Reihe von kostenlosen Tages-Workshops in seinen Regionalniederlassungen. Mobile Developer erfahren dabei alles Notwendige zur neuen Softwareplattform und den Werkzeugen von Windows Phone 7, um sofort mit der Entwicklung eigener Anwendungen beginnen zu können, um sie zu testen und über den Windows Phone Marketplace zu vertreiben. Trainer bei den Workshops ist Karsten Samaschke. Es lohnt sich somit!
Orte & Termine:
25.1.2011 – Bad Homburg
10.2.2011 – Köln
17.2.2011 – Hamburg
22.2.2011 – Unterschleißheim
24.2.2011 – Berlin

Weiterführende Informationen: Windows Phone 7 Trainings zum Nulltarif