windows phone開發學習–磁貼

來源:互聯網
上載者:User

換了一家公司以後,做的是windows phone的開發,好在是用C#,所以上手不是很難,做了一個禮拜,覺得還是有點意思的。這一周主要學習了windows phone上面的磁貼技術。

關於磁貼其實MSDN上面寫的很詳細,具體可以參看這裡:http://msdn.microsoft.com/zh-cn/library/hh202960(v=vs.92)

對於我這個程式,要做的主要有以下幾點工作:

1、實現磁貼正反翻轉

2、實現磁貼使用者手動更新

3、實現磁貼在背景工作作用下自動更新

其實第一個正反翻轉很簡單,你給磁貼設定了前景和背景,各種內容,磁貼自己就會實現翻轉。所以主要說說後面兩點。

實現磁貼使用者手動更新:

看了MSDN後會發現,磁貼分為兩種,一種是系統預設的只有一個,一種是使用者自訂的,可以有多個。先來說說修改系統磁貼,代碼如下:

   // 要用的圖片的相對路徑        private const string FORE_PIC = "/Images/Background.png";        private const string BACK_PIC = "/Images/1.png";        public static void Create(string title, string count, string backtitle, string backcontent)        {            ShellTile TileToFind = ShellTile.ActiveTiles.First();                            int Counter = 0;                StandardTileData data = new StandardTileData();                if (!string.IsNullOrEmpty(title))                {                    data.Title = title;                }                if (int.TryParse(count, out Counter))                {                    data.Count = Counter;                }                if (!string.IsNullOrEmpty(backtitle))                {                    data.BackTitle = backtitle;                }                if (!string.IsNullOrEmpty(backcontent))                {                    data.BackContent = backcontent;                }                data.BackgroundImage = new Uri(FORE_PIC, UriKind.Relative);                data.BackBackgroundImage = new Uri(BACK_PIC, UriKind.Relative);                TileToFind.Update(data);            

以上函數就能修改系統磁貼,無論該磁貼是否被pin到首頁上,這塊磁貼都會被修改。其實,儘管你在首頁上看不到系統磁貼,系統磁貼總是存在的,它原來是隱藏的。

當使用者建立自訂磁貼時,只需要修改一下代碼即可

  // 建立新磁貼                int Counter = 0;                // StandardTileData就是用來傳遞ShellTitle的屬性參數的,                // 如正面背景圖的URI,標題,計數器等。                StandardTileData myData = new StandardTileData()                {                    Title = string.IsNullOrEmpty(title) == true ? string.Empty : title,                    Count = int.TryParse(count, out Counter) == true ? Counter : 0,                    BackTitle = string.IsNullOrEmpty(backtitle) == true ? string.Empty : backtitle,                    BackContent = string.IsNullOrEmpty(backcontent) == true ? string.Empty : backcontent,                    BackgroundImage = new Uri(FORE_PIC, UriKind.Relative),                    BackBackgroundImage = new Uri(BACK_PIC, UriKind.Relative)                };                ShellTile.Create(new Uri("/MainPage.xaml", UriKind.Relative), myData);

當然,這裡使用者可能需要建立多個磁貼,為了表示區別,可以在uri中修改

ShellTile.Create(new Uri("/MainPage.xaml?s=1", UriKind.Relative), myData);  

但是之前需要判斷該塊磁貼是否存在

   ShellTile myTitle = ShellTile.ActiveTiles.FirstOrDefault(m => m.NavigationUri.ToString().Contains("s=1")); 

具體可以看這篇文章:http://blog.csdn.net/tcjiaan/article/details/7313866

好了,使用者自訂建立,更新磁貼就這樣完成了。下面說說系統後台自動修改磁貼。

顯然,windows phone是支援背景程式的,也就是儘管當前程式被關閉,但是後台還是有進程在運行。當我們的程式在第一次被開啟後,後台進程就啟動,最大運行周期是14天,也就是14天內如果主程式不再次啟動,背景程式就會被關閉。當前比較好的做法時每次主程式啟動,就修改一下後台進程的運行周期,確保每次都能得到更新。

首先是後台進程式控制制:

  public static void SetBackgroundAgent()        {            CancelBackgroundAgent();            PeriodicTask periodicTask = new PeriodicTask(GlobalAttributes.REFRESH_AGENT_NAME);            periodicTask.Description = "refresh reminders";            periodicTask.ExpirationTime = DateTime.Today.AddDays(10);            try            {                ScheduledActionService.Add(periodicTask);                ScheduledActionService.LaunchForTest(periodicTask.Name, TimeSpan.FromSeconds(15));            }            catch (InvalidOperationException exception)            {                if (exception.Message.Contains("BNS Error: The action is disabled"))                {                    MessageBox.Show("Background agents for this application have been disabled by the user.");                    //agentsAreEnabled = false;                }                if (exception.Message.Contains("BNS Error: The maximum number of ScheduledActions of this type have already been added."))                {                    // No user action required. The system prompts the user when the hard limit of periodic tasks has been reached.                }            }            catch { }        }public static void CancelBackgroundAgent()        {            try            {                ScheduledActionService.Remove(GlobalAttributes.REFRESH_AGENT_NAME);            }            catch { }        }

在ScheduledSyncTaskAgent中添加下面代碼,可以參看這篇文章:http://www.cnblogs.com/WilsonWu/archive/2011/12/27/2303340.html

protected override void OnInvoke(ScheduledTask task){if (task.Name == GlobalAttributes.REFRESH_AGENT_NAME){                RefreshPlaster(); //更新系統磁貼}            else            {                NotifyComplete();            }}

更新磁貼代碼就調用之前的代碼即可

      public void RefreshPlaster()        {            SetPlaster.Create("123","22","fsdfd","dsfd");//參數其實可以自己設定,例如擷取系統本地時間            NotifyComplete();        }

windows phone中每次只能添加一個背景工作,所以如果需要執行多個任務,只能放到一個任務中,也就是像這樣

if (task.Name == GlobalAttributes.REFRESH_AGENT_NAME){RefreshReminder();                RefreshPlaster();//...//...}

以上就是我自己的一些心得,其實也可以通過訊息推送機制更新磁貼,但我這個程式並不需要,具體MSDN上面都有,最後不得不說MSDN實在太強大了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.