Posts mit dem Label C# werden angezeigt. Alle Posts anzeigen
Posts mit dem Label C# werden angezeigt. Alle Posts anzeigen

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 - 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 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.

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

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 - 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

Dienstag, 18. Oktober 2011

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");

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");

Dienstag, 11. Mai 2010

BioScripter - Script Generator für Pipettierroboter v1

Im Rahmen seiner Doktorarbeit arbeitet Robert Schäwe, Wissenschaftler am UFZ, mit dem Pipettierroboter BioMek 2000.
Der Roboter muß in diesem Zusammenhang große Mengen von Probentöpfchen mit Bakterien verschiedenster Kulturen befüllen. Um ein möglichst genaues Versuchsergebnis zu erhalten, ist es erforderlich, die Proben in einem sehr kurzem Zeitraum zusammenzustellen.

Projektposter

Projektposter

Da die Standardsoftware des Roboters entsprechend optimierte Funktionen nicht bereithält, wurde Fachinformatiker-Azubi Andreas Menge mit der Erstellung eines neuen Programms beauftragt. Mit diesem werden nun die optimerten Pipettierschritte errechnet und an den Roboter gesandt.

Der BioMek beim Abarbeiten der optimierten Pipettierschritte.

Das Pipettierschema, aus dem hervorgeht in welchen Mengen welche Kulturen in die jeweiligen Probentöpfchen kommen, wird dabei als Excel-Arbeitsmappe bereitgestellt. Diese Datei wird vom BioScripter importiert und die Befüllungsmatrix durch einen Algorithmus umgewandelt, der sowohl die gewünschte Geschwindigkeit erzielt wie auch auch Kreuzkontamination verhindert.

Projektpräsentation

Projektpräsentation

Pressemitteilung in der Leipziger Volkszeitung

Pressemitteilung in der Leipziger Volkszeitung vom 21.05.2010

Aus Zeitgründen wurde das C#-Programm für diesen speziellen Versuch entwickelt und lässt momentan keine weiteren Anwendungen zu. Deshalb wird das Programm zur Zeit weiterentwickelt. Dabei wird vor allem Punkto Benutzerfreundlichkeit und Flexibilität einiges verbessert werden.

BioScripter - Script Generator für Pipettierroboter v1

Im Rahmen seiner Doktorarbeit arbeitet Robert Schäwe, Wissenschaftler am UFZ, mit dem Pipettierroboter BioMek 2000.
Der Roboter muß in diesem Zusammenhang große Mengen von Probentöpfchen mit Bakterien verschiedenster Kulturen befüllen. Um ein möglichst genaues Versuchsergebnis zu erhalten, ist es erforderlich, die Proben in einem sehr kurzem Zeitraum zusammenzustellen.

Projektposter

Projektposter

Da die Standardsoftware des Roboters entsprechend optimierte Funktionen nicht bereithält, wurde Fachinformatiker-Azubi Andreas Menge mit der Erstellung eines neuen Programms beauftragt. Mit diesem werden nun die optimerten Pipettierschritte errechnet und an den Roboter gesandt.

Der BioMek beim Abarbeiten der optimierten Pipettierschritte.

Das Pipettierschema, aus dem hervorgeht in welchen Mengen welche Kulturen in die jeweiligen Probentöpfchen kommen, wird dabei als Excel-Arbeitsmappe bereitgestellt. Diese Datei wird vom BioScripter importiert und die Befüllungsmatrix durch einen Algorithmus umgewandelt, der sowohl die gewünschte Geschwindigkeit erzielt wie auch auch Kreuzkontamination verhindert.

Projektpräsentation

Projektpräsentation

Pressemitteilung in der Leipziger Volkszeitung

Pressemitteilung in der Leipziger Volkszeitung vom 21.05.2010

Aus Zeitgründen wurde das C#-Programm für diesen speziellen Versuch entwickelt und lässt momentan keine weiteren Anwendungen zu. Deshalb wird das Programm zur Zeit weiterentwickelt. Dabei wird vor allem Punkto Benutzerfreundlichkeit und Flexibilität einiges verbessert werden.

Freitag, 30. Oktober 2009

Erweiterte Designtime Features bei Custom Controls im .NET Compact Framework I

Meine Zielstellung war es hier Anfangs nur das Smart-Tag (Adorner) zur Beeinflussung der Control Properties zu erzeugen.

Erst im Laufe meiner Bemühungen habe ich die Möglichkeiten erkannt, welche man beim Einsatz eines Custom Designer hat.

Der erste Schritt hier ist das Erweitern des CF-Projektes, um ein zusätzliches Projekt aus dem Standard .NET Framework. Bei beiden Projekten handelt es sich Steuerelementbibliotheken.

Erweiterte Designtime Features bei Custom Controls im .NET Compact Framework I

Meine Zielstellung war es hier Anfangs nur das Smart-Tag (Adorner) zur Beeinflussung der Control Properties zu erzeugen.

Erst im Laufe meiner Bemühungen habe ich die Möglichkeiten erkannt, welche man beim Einsatz eines Custom Designer hat.

Der erste Schritt hier ist das Erweitern des CF-Projektes, um ein zusätzliches Projekt aus dem Standard .NET Framework. Bei beiden Projekten handelt es sich Steuerelementbibliotheken.

Donnerstag, 29. Oktober 2009

.NET: URI-Formate werden nicht unterstützt

Ich bekomme diese Fehlermeldung wenn ich eine Pfadangabe erzeugt z.B. durch...
this.appPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);

... wie hier direkt verwende.
backShot.Save(this.appPath + @"\_backshot.bmp", ImageFormat.Bmp);
Ausgabe: "file:\C:\Users\dutzend..."

Die Meldung wird also durch das Protokoll-Prefix ausgelöst.

Workaround:
this.appPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);

if(this.appPath.Contains(@"file:\"))
this.appPath = this.appPath.Substring(6);

.NET: URI-Formate werden nicht unterstützt

Ich bekomme diese Fehlermeldung wenn ich eine Pfadangabe erzeugt z.B. durch...
this.appPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);

... wie hier direkt verwende.
backShot.Save(this.appPath + @"\_backshot.bmp", ImageFormat.Bmp);
Ausgabe: "file:\C:\Users\dutzend..."

Die Meldung wird also durch das Protokoll-Prefix ausgelöst.

Workaround:
this.appPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);

if(this.appPath.Contains(@"file:\"))
this.appPath = this.appPath.Substring(6);