Wenn man z.B. den neuen Progressindikator (Mango) im Systray verwendet, wird der Inhalt der Phonepage nach unten geschoben wenn der Progressindikator eingeblendet wird. Das ist ein sehr unschöner Effekt.
Verhindern kann man das durch:
SystemTray.SetIsVisible(this, true);
SystemTray.SetOpacity(this, 0.2);
Kleinere Werte als 1 bei Opacity führen zum gewünschten Effekt.
Wenn man z.B. den neuen Progressindikator (Mango) im Systray verwendet, wird der Inhalt der Phonepage nach unten geschoben wenn der Progressindikator eingeblendet wird. Das ist ein sehr unschöner Effekt.
Verhindern kann man das durch:
SystemTray.SetIsVisible(this, true);
SystemTray.SetOpacity(this, 0.2);
Kleinere Werte als 1 bei Opacity führen zum gewünschten Effekt.
Basierend auf dem hier beschriebenen, nochmal eine Variante die ein paar mehr Möglichkeiten bietet.
XAML:
Herkömmliche Variante:
ImageIpCam.Source =
new BitmapImage(new Uri("http://www.it4zwigge.de/images/logo.jpg"));
Felder:
...
private WebClient _webClient;
private BitmapImage _currentImage;
...
Konstruktor:
...
_currentImage = new BitmapImage();
_webClient = new WebClient();
_webClient.OpenReadCompleted +=
new OpenReadCompletedEventHandler(_webClient_OpenReadCompleted);
...
Methode 1 - Image asynchron herunterladen und einem Image-Control zuweisen:
private void _webClient_OpenReadCompleted(object sender,
OpenReadCompletedEventArgs e)
{
if (e.Error == null && !e.Cancelled)
{
try
{
_currentImage.SetSource(e.Result);
ImageIpCam.Source = _currentImage;
}
catch {}
}
}
Methode 2 - Image bei Bedarf speichern:
private void SaveImage(string imageToSave)
{
try
{
String tempImage = "TempImage";
var myStore = IsolatedStorageFile.GetUserStoreForApplication();
if (myStore.FileExists(tempImage))
{
myStore.DeleteFile(tempImage);
}
IsolatedStorageFileStream myFileStream = myStore.CreateFile(tempImage);
WriteableBitmap wb = new WriteableBitmap(_currentImage);
wb.SaveJpeg(myFileStream, wb.PixelWidth, wb.PixelHeight, 0, 85);
myFileStream.Close();
myFileStream = myStore.OpenFile(tempImage, FileMode.Open, FileAccess.Read);
MediaLibrary mediaLibrary = new MediaLibrary();
mediaLibrary.SavePicture(imageToSave, myFileStream);
myFileStream.Close();
MessageBox.Show("Das Bild liegt jetzt im Album \"Gespeicherte Bilder\".");
}
catch (Exception ex)
{
MessageBox.Show("Fehler beim Speichern! " + ex.Message);
}
}
Basierend auf dem hier beschriebenen, nochmal eine Variante die ein paar mehr Möglichkeiten bietet.
XAML:
Herkömmliche Variante:
ImageIpCam.Source =
new BitmapImage(new Uri("http://www.it4zwigge.de/images/logo.jpg"));
Felder:
...
private WebClient _webClient;
private BitmapImage _currentImage;
...
Konstruktor:
...
_currentImage = new BitmapImage();
_webClient = new WebClient();
_webClient.OpenReadCompleted +=
new OpenReadCompletedEventHandler(_webClient_OpenReadCompleted);
...
Methode 1 - Image asynchron herunterladen und einem Image-Control zuweisen:
private void _webClient_OpenReadCompleted(object sender,
OpenReadCompletedEventArgs e)
{
if (e.Error == null && !e.Cancelled)
{
try
{
_currentImage.SetSource(e.Result);
ImageIpCam.Source = _currentImage;
}
catch {}
}
}
Methode 2 - Image bei Bedarf speichern:
private void SaveImage(string imageToSave)
{
try
{
String tempImage = "TempImage";
var myStore = IsolatedStorageFile.GetUserStoreForApplication();
if (myStore.FileExists(tempImage))
{
myStore.DeleteFile(tempImage);
}
IsolatedStorageFileStream myFileStream = myStore.CreateFile(tempImage);
WriteableBitmap wb = new WriteableBitmap(_currentImage);
wb.SaveJpeg(myFileStream, wb.PixelWidth, wb.PixelHeight, 0, 85);
myFileStream.Close();
myFileStream = myStore.OpenFile(tempImage, FileMode.Open, FileAccess.Read);
MediaLibrary mediaLibrary = new MediaLibrary();
mediaLibrary.SavePicture(imageToSave, myFileStream);
myFileStream.Close();
MessageBox.Show("Das Bild liegt jetzt im Album \"Gespeicherte Bilder\".");
}
catch (Exception ex)
{
MessageBox.Show("Fehler beim Speichern! " + ex.Message);
}
}
Die in den meisten Foren beschriebenen Methoden zum Speichern im Isolated Storage verwenden relative Uri. Möchte man ein aus dem Web heruntergeladenes Bild speichern hat man es aber mit einer absoluten Uri zu tun.
Um diesem Dilemma zu entkommen, kann man folgendes Pattern verwenden:
private void SaveImage(string fileToSave, string absoluteUri)
{
try
{
WebClient webClient = new WebClient();
webClient.OpenReadCompleted += (s, e) =>
{
if (e.Error != null)
{
return;
}
Stream stream = e.Result;
BitmapImage bitmap = new BitmapImage();
bitmap.SetSource(stream);
String tempImage = "TempImage";
var myStore = IsolatedStorageFile.GetUserStoreForApplication();
if (myStore.FileExists(tempImage))
{
myStore.DeleteFile(tempImage);
}
IsolatedStorageFileStream myFileStream = myStore.CreateFile(tempImage);
WriteableBitmap wb = new WriteableBitmap(bitmap);
wb.SaveJpeg(myFileStream, wb.PixelWidth, wb.PixelHeight, 0, 85);
myFileStream.Close();
myFileStream = myStore.OpenFile(tempImage, FileMode.Open, FileAccess.Read);
MediaLibrary mediaLibrary = new MediaLibrary();
mediaLibrary.SavePicture(fileToSave, myFileStream);
myFileStream.Close();
MessageBox.Show("Ihr Bild liegt jetzt im Album \"Gespeicherte Bilder\".");
};
webClient.OpenReadAsync(new Uri(absoluteUri));
}
catch (Exception ex)
{
MessageBox.Show("Fehler beim Speichern! " + ex.Message);
}
}
Wenn man diese Methode anwendet, schlägt zwei Fliegen mit einer Klappe. Das Bild wird asynchron heruntergeladen und anschließend gespeichert. Wie man das ganze aufteilt, also erst herunterladen und anzeigen und dann bei Bedarf speichern, schreibe ich im nächsten Beitrag.