Freitag, 28. Oktober 2011
Dienstag, 25. Oktober 2011
Windows Phone 7 - Verhindern das Systray Content nach unten schiebt
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.
Windows Phone 7 - Image herunterladen, anzeigen und bei Bedarf speichern
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); } }
Windows Phone 7 - Image mit absoluter Uri im Isolated Storage speichern
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.
Mittwoch, 19. Oktober 2011
FHEM - Webserver verwenden
Da der Wiki-Eintrag zum Thema ein bisschen knapp ist, hier noch ein paar Ergänzungen:
- Alle Dateien die man veröffentlichen will, gehören in das Verzeichnis FHEM (usr/share/fhem/FHEM).
- Man kann hier keine Unterverzeichnisse verwenden.
Wie im Wiki beschrieben kann man die Files dann z.B. mit http://fritz.box:8083/fhem/mysite.html
erreichen. Das gilt auch für PNG-Grafiken.
Will man andere Grafiken (GIF, JPEG) verwenden, gehören die in den selben Ordner! Referenziert wird aber z.B. mit http://fritz.box:8083/fhem/icons/myimg.jpg
Windows Phone 7 - ApplicationBarIconButton wirft NullReferenceException
Leider kann man auf ApplicationBarIconButton
-Objekte nicht wie gewohnt zugreifen. Das heißt wenn man die Objekte mit x:Name
identifiziert...
... könnte der erste Versuch einer Modifizierung im Codebehind so aussehen:
this.AppBarButtonSave.IsEnabled = true;
Das schlägt leider mit einer NullReferenceException
fehl (wohl ein Bug.)
Abhilfe schafft hier eine zusätzliche Initialisierung der Buttons zum Beispiel im Konstruktor der Klasse:
public MainPage()
{
InitializeComponent();
this.AppBarButtonSave = ApplicationBar.Buttons[0] as ApplicationBarIconButton;
}
Man findet noch andere Workarounds, dass hat mir erstmal weitergeholfen
Windows Phone 7 - Image Source im Codebehind zuweisen
Das Silverlight-Control Image
dient als Container für ein anzuzeigendes Bild. Im XAML kann ich das Bild zum Beispiel so referenzieren:
<Image Source="NoConnect.jpg" x:Name="ImageIPCam1"/>
<Image Source="http://www.it4zwigge.de/icons/ipcam1.jpg" x:Name="ImageIPCam2"/>
Im Codebehind lässt sich allerdings nicht so einfach einen String
zuweisen. Der Versuch...
ImageIPCam2.Source = "http://www.it4zwigge.de/icons/ipcam2.jpg";
... schlägt fehl, weil als Source kein String
sondern ein ImageSource
-Objekt (Bitmap) verlangt wird.
Eine kleine Funktion schafft hier Abhilfe:
private BitmapImage String2Bmp(String source)
{
Uri uri = new Uri(source, UriKind.RelativeOrAbsolute);
BitmapImage bmp = new BitmapImage(uri);
return bmp;
}
Die man z.B. so aufrufen kann:
ImageIPCam2.Source = String2Bmp("http://it4zwigge.de/icons/ipcam2.jpg");
Freitag, 7. Oktober 2011
FHEM - Wert per HTTP setzen und in Perl verwenden
Konkret muss ich Home of FHEM eine veränderliche URI eines Channels für eine Windows Phone Push Notification mitteilen und in einem Perl-Skript verwenden, welches die Notification per POST absetzt.
Hierzu bin ich wie folgt vorgegangen:
1. Um den Wert in FHEM zu halten habe in ein Dummy-Device in der fhem.cfg mit define channeluri dummy
definiert.
2. Den Wert des Dummys setze ich per HTTP, z.B. mit http://fritz.box:8083/fhem?cmd=set channeluri+CHANNELURI
3. Auf den gesetzten Wert kann ich dann in meinen Skript mit $value{channeluri}
zugreifen.
Abonnieren
Posts (Atom)