Category Archives: C#

GetIsNetworkAvailable() als asyncrone Methode

Ich weiß echt nicht warum, aber es gibt im Windows Phone SDK immer noch eine wichtige Methode die nicht asyncron verfügbar ist. Mit den neuen ‚async‘ und ‚await‘ Schlüsselwörtern macht es aber auf jeden Fall Sinn dies zu implementieren. Here we go:


/// <summary>
/// Checks asyncron if Network is available
/// </summary>
public async Task<bool> IsNetworkAvaiable()
{
Task<bool> _Task = new Task<bool>(() => System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable());
_Task.Start();
await _Task;
return _Task.Result;
}

Leave a Comment

Filed under C#, Windows Phone

Linq Distinct Nutzung bei Custom Objects

Wollte gerade eine Liste via Linq filtern, so dass jedes Objekt nur noch einmal drin vorkommt. Theoretisch klappt das so:

var result = this.PersonList.Distinct().ToList<person>();

Problem ist, dass ich das ganze auf eine Liste anwende, welche Custom Objects enthält. Hier muss dann noch ein wenig Vorarbeit geleistet werden.
Und zwar muss das IEquatable Interface und die zwei Methoden Equals/GetHashCode implementiert werden. Danach sieht die Klasse wie folgt aus:

public class person : IEquatable<person>
{
	public int ID { get; set; }
	public string Name { get; set; }

	public bool Equals(person obj)
	{
		if (this.Name == obj.Name && this.ID == obj.ID)
			return true;

		return false;
	}

	public override int GetHashCode()
	{
		int HashPersonName = this.Name == null ? 0 : this.Name.GetHashCode();
		int HashPersonID = this.ID == null ? 0 : this.ID.GetHashCode();
		return HashPersonName ^ HashPersonID;
	}
}

Und schon funktioniert Distinct() auch wie oben beschrieben.

Achtung: Es wird nicht die Methode Equals überschrieben, sondern eine eigene erstellt!

Leave a Comment

Filed under C#

Maximal Größe von Controls in Windows Phone

Wie ich gerade feststellen musste, gibt es bei Windows Phone eine Maximalgröße für Controls welche bei 2048px (bzw. Width/Height) liegt. In meinem Fall ging es um einen sehr sehr langen Text welchen ich in einem TextBlock darstellen wollte. Die Lösung hierfür war ein Custom Control welches einfach mehrere TextBlock’s in einem Stackpanel unterbringt. Wie das Ganze funktioniert ist hier in einem MSDN Blog Artikel von Alex Yakhnin erklärt. Solltet ihr die Control tatsächlich verwenden wollen, nutzt am besten den Quellcode welchen im Beitrag ganz unten angehängt ist. Der Quellcode, welcher im Beitrag selbst gezeigt wird, ist nicht vollständig!

Quellcode

Leave a Comment

Filed under C#, Windows Phone

Bestimmen ob WLAN aktuelle Internet Netzwerk Schnittstelle in Windows Phone 7/8 ist

Neulich musst ich feststellen, dass Windows Phone automatisch auf eine Handy Netz Connection umswitcht wenn über das WLAN kein Internet zubekommen ist. Das ist sehr unpraktisch, insbesondere wenn man als App Entwickler sicherstellen möchte das der Traffic nur über das WLAN fließt. Früher habe ich mit den folgenden Zeilen einfach abgeprüft ob das WLAN aktiviert wurde:

using Microsoft.Phone.Net.NetworkInformation;
if(DeviceNetworkInformation.IsWiFiEnabled == true)
{
// Add code
}

Besser ist allerdings:

using Microsoft.Phone.Net.NetworkInformation;
if (NetworkInterface.NetworkInterfaceType == NetworkInterfaceType.Wireless80211)
{
// Add code
}

Der Unterschied ist durchaus nicht zu vernachlässigen. Die 1. Methode testet schlicht ob WLAN überhaupt aktiviert ist. Die 2. Methode hingegen testet ob aktuell alle Daten welche ins Internet wollen über das WLAN fließen und dies auch funktioniert.

Leave a Comment

Filed under C#, Windows Phone

Erste eigene Windows Phone 7 App: MPC-Remote

Anfang Dezember war es bei mir mal wieder soweit, ich brauchte ein neues Handy. Da mir Windows Phone 7 schon bei meinen ersten Tests sehr gut gefallen hatte und mich das Design des neuen Nokia Lumia 800 sehr angesprochen hat, war schnell klar welches es wird.

Da ich mich unter anderem auch ein wenig auf die Programmierung mit C# verstehe war schnell klar, dass ich auch eigene Apps schreiben möchte. Um ein wenig in die Entwicklung rein zu kommen, welche doch ein Stück von der Desktop-App Entwicklung abweicht, besuchte ich das ‚Windows Phone 7 Coding Camp‘ welches von Microsoft in Zusammenarbeit mit der Hochschule der Medien in Stuttgart abgehalten wurde.

Ohne lange nachdenken zu müssen, war mir klar was für eine App ich schreibe. Und zwar eine Remote Control für Media Player Classic – Home Cinema. Warum? Weil ich den Player schlicht dem VLC vorziehe und es noch keine, meinen Ansprüchen genügende, App gab.

Meine App hab ich auf den Namen ‚MPC-HC Remote‘ getauft. Finden könnt ihr sie im Marketplace auf eurem Smartphone oder direkt über diesen Link.

Features:

  • Play/Pause
  • Nächster/letzter Titel
  • Lautstärken Steuerung
  • Vollbild de-/aktivieren

Geplante Features:

  • Browse Funktion
  • Schlagt mir was vor 😉

1 Comment

Filed under C#, Windows Phone

Exception Bug in .Net WebClient DownloadStringAsync Methode [Update]

Tja da frag ich mich ewig warum die ‚DownloadStringAsyn‚-Methode der ‚WebClient‚-Klasse von .Net mir eine NullReferenz Exception zurück gibt und am Ende muss ich feststellen, dass es an meiner URL lag… Von vorne:

Ich versuche mit der ‚DownloadStringAsync‘-Methode die browser.html von ‚MPC-HC‚ abzurufen um so die dort aufgeführten Werte in der dazugehörigen Windows Phone 7 App zu verarbeiten. Dies aber funktioniert nie, da ich immer eine NullReferenz Exception zurückbekomme.

So sieht z.B. eine der aufgerufenen URLs aus:

http://10.41.2.2:13579/browser.html?path=C:\Users\username\Desktop

Das Problem?
Die ‚DownloadStringAsync‘-Methode kommt nicht mit den Backslash’s klar und wirft eine absolut nichts sagende Exception.

Die Lösung?
‚MPC-HC‘ akzeptiert es auch, wenn man den Pfad Namen durch Slash’s trennt. Und schon läufts 🙂 Dies ist natürlich kein Bugfix sondern lediglich ein Workaround. Der Bug selbst ist hier schon bei Microsoft gemeldet.

[Update]: Ok, ich habe nun ein gut funktionierenden Workaround gefunden, man muss nur alle Backslashs mit „%5C“ ersetzen dann klappt alles wie gewollt.

Exception Message Ausschnitt:

-		error	{"An exception occurred during a WebClient request. "}	System.Exception {System.Net.WebException}
+		[System.Net.WebException]	{"An exception occurred during a WebClient request. "}	System.Net.WebException
		_data	null	System.Collections.IDictionary
		_HResult	-2146233079	int
-		_innerException	{""}	System.Exception
		_data	null	System.Collections.IDictionary
		_HResult	-2146233088	int
+		_innerException	{"0x80000012"}	System.Exception
		_message	""	string
+		_methodDescs	{System.IntPtr[9]}	System.IntPtr[]
		_optionalData	null	object[]
+		Data	{System.Collections.ListDictionaryInternal}	System.Collections.IDictionary {System.Collections.ListDictionaryInternal}
		HResult	-2146233088	int
-		InnerException	{"0x80000012"}	System.Exception
		_data	null	System.Collections.IDictionary
		_HResult	-2146233088	int
		_innerException	null	System.Exception
		_message	"0x80000012"	string
+		_methodDescs	{System.IntPtr[15]}	System.IntPtr[]
		_optionalData	null	object[]
+		Data	{System.Collections.ListDictionaryInternal}	System.Collections.IDictionary {System.Collections.ListDictionaryInternal}
		HResult	-2146233088	int
		InnerException	Der Ausdruck konnte nicht ausgewertet werden.	System.Exception
		Message	"0x80000012"	string
		StackTrace	"   at MS.Internal.XcpImports.CheckHResult(UInt32 hr)\r\n   at MS.Internal.XcpImports.WebRequest_Send(InternalWebRequest request)\r\n   at MS.Internal.InternalWebRequest.Send()\r\n   at System.Net.Browser.ClientHttpWebRequest.PrepareAndSendRequest(String method, Uri requestUri, Stream requestBodyStream, WebHeaderCollection headerCollection, CookieContainer cookieContainer)\r\n   at System.Net.Browser.ClientHttpWebRequest.BeginGetResponseImplementation()\r\n   at System.Net.Browser.ClientHttpWebRequest.InternalBeginGetResponse(AsyncCallback callback, Object state)\r\n   at System.Net.Browser.ClientHttpWebRequest.BeginGetResponse(AsyncCallback callback, Object state)\r\n   at System.Net.WebClient.DownloadBits(WebRequest request, Stream writeStream, CompletionDelegate completionDelegate, AsyncOperation asyncOp)\r\n   at System.Net.WebClient.DownloadStringAsync(Uri address, Object userToken)\r\n   at MPC_Remote.MainPage.button1_Click(Object sender, RoutedEventArgs e)\r\n   at System.Windows.Controls.Primitives.ButtonBase.OnClick()\r\n   at System.Windows.Controls.Button.OnClick()\r\n   at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)\r\n   at System.Windows.Controls.Control.OnMouseLeftButtonUp(Control ctrl, EventArgs e)\r\n   at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName)\r\n"	string
		Message	""	string
		StackTrace	"   at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state)\r\n   at System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)\r\n   at System.Net.WebClient.GetWebResponse(WebRequest request, IAsyncResult result)\r\n   at System.Net.WebClient.DownloadBitsResponseCallback(IAsyncResult result)\r\n   at System.Net.Browser.ClientHttpWebRequest.&lt;&gt;c__DisplayClassa.b__8(Object state2)\r\n   at System.Threading.ThreadPool.WorkItem.WaitCallback_Context(Object state)\r\n   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)\r\n   at System.Threading.ThreadPool.WorkItem.doWork(Object o)\r\n   at System.Threading.Timer.ring()\r\n"	string
		_message	"An exception occurred during a WebClient request. "	string
+		_methodDescs	{System.IntPtr[17]}	System.IntPtr[]
		_optionalData	null	object[]
+		Data	{System.Collections.ListDictionaryInternal}	System.Collections.IDictionary {System.Collections.ListDictionaryInternal}
		HResult	-2146233079	int
+		InnerException	{""}	System.Exception
		Message	"An exception occurred during a WebClient request. "	string
		StackTrace	"   at System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary()\r\n   at System.Net.DownloadStringCompletedEventArgs.get_Result()\r\n   at MPC_Remote.MainPage.client_DownloadStringCompleted(Object sender, DownloadStringCompletedEventArgs e)\r\n   at System.Net.WebClient.OnDownloadStringCompleted(DownloadStringCompletedEventArgs e)\r\n   at System.Net.WebClient.DownloadStringOperationCompleted(Object arg)\r\n   at System.Reflection.RuntimeMethodInfo.InternalInvoke(RuntimeMethodInfo rtmi, Object obj, BindingFlags invokeAttr, Binder binder, Object parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess, StackCrawlMark&amp; stackMark)\r\n   at System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, StackCrawlMark&amp; stackMark)\r\n   at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)\r\n   at System.Delegate.DynamicInvokeOne(Object[] args)\r\n   at System.MulticastDelegate.DynamicInvokeImpl(Object[] args)\r\n   at System.Delegate.DynamicInvoke(Object[] args)\r\n   at System.Windows.Threading.DispatcherOperation.Invoke()\r\n   at System.Windows.Threading.Dispatcher.Dispatch(DispatcherPriority priority)\r\n   at System.Windows.Threading.Dispatcher.OnInvoke(Object context)\r\n   at System.Windows.Hosting.CallbackCookie.Invoke(Object[] args)\r\n   at System.Windows.Hosting.DelegateWrapper.InternalInvoke(Object[] args)\r\n   at System.Windows.RuntimeHost.ManagedHost.InvokeDelegate(IntPtr pHandle, Int32 nParamCount, ScriptParam[] pParams, ScriptParam&amp; pResult)\r\n"	string

Leave a Comment

Filed under C#, Windows

Regex für Media Player Classic – Home Cinema Browse

Ich bastel gerade für Windows Phone 7 eine Remote Control App für ‚Media Player Classic – Home Cinema‚, welche auch die browse.html Seite des Webinterfaces nutzen soll. Um diese sinnvoll verarbeiten zu können, benötigt man einen Regex welcher die benötigten Infos aus der HTML-Seite rausparsed. Das hier hat bei mir in Version 1.5.2.3456 geklappt:

.*path=(?<Path>.*?)\">(?<Name>.*)</a>.*nobr.?>(?<Size>\\d+).*|.*path=(?<Path>.*?)\">(?<Name>.*)</a>.*Directory.*

Das ganze nutze ich so ein ‚Match‘-Regex. Es kommt raus:

  • Pfad zur Datei/Verzeichnis
  • Datei-/Verzeichnisname
  • Wenn vorhanden: Filesize in KiloByte

Leave a Comment

Filed under C#