using System; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Ink; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.Reflection; namespace CheckForMango { public static class MangoExtensions { private static Version MangoVersion = new Version(7, 1); public static bool IsMangoDevice { get { return Environment.OSVersion.Version >= MangoVersion; } } public static void CreateTile(string title, Uri uri) { if (IsMangoDevice) { Type t = Type.GetType("Microsoft.Phone.Shell.StandardTileData, Microsoft.Phone"); Type shellTileType = Type.GetType("Microsoft.Phone.Shell.ShellTile, Microsoft.Phone"); var prop = shellTileType.GetProperty("ActiveTiles"); var tiles = prop.GetValue(prop, null) as System.Collections.IEnumerable; //Check if we already have a tile with this navigation uri and delete it foreach (var tile in tiles) { var tileuri = shellTileType.GetProperty("NavigationUri").GetValue(tile, null) as Uri; if (tileuri.ToString() == uri.ToString()) { shellTileType.GetMethod("Delete").Invoke(tile, null); break; } } //create the new tile var NewTileData = t.GetConstructor(new Type[] { }).Invoke(null); SetProperty(NewTileData, "Title", title); var createMethod = shellTileType.GetMethod("Create"); createMethod.Invoke(null, new object[] { uri, NewTileData }); } } public static void SetTrayColor(Color color) { if (IsMangoDevice) { typeof(Microsoft.Phone.Shell.SystemTray).GetProperty("BackgroundColor").GetSetMethod().Invoke(null, new object[] { color }); } } private static void SetProperty(object instance, string name, object value ) { var setMethod = instance.GetType().GetProperty(name).GetSetMethod(); setMethod.Invoke(instance, new object[] { value }); } public static void AddEventHandler_Hold(this UIElement element, RoutedEventHandler handler) { AddEventHandler("Hold", element, handler); } public static void RemoveEventHandler_Hold(this UIElement element, RoutedEventHandler handler) { RemoveEventHandler("Hold", element, handler); } public static void AddEventHandler_Tap(this UIElement element, RoutedEventHandler handler) { AddEventHandler("Tap", element, handler); } public static void RemoveEventHandler_Tap(this UIElement element, RoutedEventHandler handler) { RemoveEventHandler("Tap", element, handler); } public static void AddEventHandler_DoubleTap(this UIElement element, RoutedEventHandler handler) { AddEventHandler("DoubleTap", element, handler); } public static void RemoveEventHandler_DoubleTap(this UIElement element, RoutedEventHandler handler) { RemoveEventHandler("DoubleTap", element, handler); } private static void AddEventHandler(string eventName, UIElement element, Delegate d) { AddRemoveEventHandler(eventName, element, d, false); } private static void RemoveEventHandler(string eventName, UIElement element, Delegate d) { AddRemoveEventHandler(eventName, element, d, true); } private static void AddRemoveEventHandler(string eventName, UIElement element, Delegate d, bool remove) { var eventMethod = typeof(UIElement).GetEvent(eventName); if (eventMethod != null) { System.Reflection.MethodInfo eventInfo = null; if(remove) eventInfo = eventMethod.GetRemoveMethod(); else eventInfo = eventMethod.GetAddMethod(); Type tDelegate = eventMethod.EventHandlerType; Delegate d2 = Delegate.CreateDelegate(tDelegate, d.Target, d.Method); eventInfo.Invoke(element, new object[] { d2 }); } } } }