Wer Windows und Windows Phone Apps entwickelt wird festgestellt haben, dass es das CameraCaptureUI nicht für Windows Phone gibt. Das CameraCaptureUI stellt Methoden – und vor allem ein UI – zur Verfügung, das das Aufnehmen von Bildern sehr einfach macht und sich daher großer Beliebtheit erfreut. Zumindest für meine kleinen Demos, die ich immer ad hoc während einer Session zusammenschraube, ist es sehr gut geeignet.

CameraCaptureUI cam = new CameraCaptureUI();
var pic = await cam.CaptureFileAsync(CameraCaptureUIMode.Photo);

Diese zwei magischen Zeilen Code führen auf Windows 8 dazu, dass ein neues Bild aufgenommen und gespeichert wird. Nun möchte ich im Zuge der Universal Apps ja recht gerne auch die Kamera benutzen und natürlich auch sehr gerne das CameraCaptureUI. Leider klappt das eben nicht, da es die entsprechende Klasse auf Windows Phone 8.1 heute nicht gibt.  Um hier dennoch Universal App Demos erstellen zu können, ohne auf CaeraCaptureUI zu verzichten, habe ich mir ein Do-It-Yourself CameraCaptureUI gebaut, das unter Windows Phone funktioniert.

Natürlich habe ich es nicht vollständig implementiert (kein Video, kein Einstellungsauswahl, keine Auflösungseinstellung, keine Kameraauswahl), sondern nur, was ich für meine Demo brauche. Die Lösung schaut schematisch folgendermaßen aus.

Ich wechsle also mit dem Aufruf des CameraCaptureUI in einen neuen Frame. Der neue Frame bekommt eine neue Page, die nur die Kamera-Vorschau sowie einen Button zum Auslösen beinhaltet.

Sobald ausgelöst wird, wird das Bild gespeichert, und die App wechselt die Frames wieder aus – der neue Frame wird verworfen, der alte wird wieder angezeigt. Ganz wichtig: Natürlich wird alles wieder schön aufgeräumt. Das hat für meine (einfachen) Demos ganz gut funktioniert.
Die Implementierung der Asynchronität von CameraCaptureUI habe ich durch eine einfache Schleife hinbekommen, die solange warten lässt, bis eben ausgelöst wurde.

Um ehrlich zu sein, finde ich das etwas dirty, (eher so Kategorie Tipp 17B) es hat hier aber seinen Zweck ganz gut erfüllt.

async private Task IsStopped() {
while (!StopFlag) 
{     
await Task.Delay(WaitForClickLoopLength);     
}
}

In die App wird das neue CameraCaptureUI über den Namespace DMX.Helper eigebunden. Den sollte man allerdings nur im Windows Phone einbinden, sonst besteht die Gefahr, dass man dieses CameraCaptureUI auch auf Windows 8.1 verwendet… insofern: Bedingte Compilierung mit #ifdef

#if WINDOWS_PHONE_APP 
using DMX.Helper; 
#endif 
 

Wer jetzt Lust hat kann das Projekt noch ausbauen, Fehler fixen und funktional komplettieren. Den Code dazu habe ich auf Codeplex gestellt.
Kleiner Disclaimer: Seid Euch bitte bewusst, dass das Projekt nicht offiziell  von mir oder MS supported wird, sondern hier lediglich als Anschauungsobjekt dient.