Windows Phone 7 程式等待頁面的處理

來源:互聯網
上載者:User

    程式啟動通常會有一個等待的過程,在這個過程中可以通過使用Popup控制項配合BackgroundWorker類啟動後台線程來實現。

控制項的代碼

PopupSplash.xaml

<UserControl x:Class="ProgressSplashScreen.PopupSplash"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
d:DesignHeight="800" d:DesignWidth="480">

<Grid x:Name="LayoutRoot" Background="White" Width="480" Height="800">
<ProgressBar HorizontalAlignment="Left" Margin="0,755,0,0" Name="progressBar1" Width="480" Background="DarkRed" />
<Image Height="757" HorizontalAlignment="Left" Name="image1" Stretch="Fill" VerticalAlignment="Top" Width="480" Source="/ProgressSplashScreen;component/wuyuan.png" />
<TextBlock HorizontalAlignment="Left" Margin="171,656,0,97" Name="textBlock1" Text="Loading..." Width="208" Foreground="Black" FontSize="30" />
</Grid>
</UserControl>

cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace ProgressSplashScreen
{
public partial class PopupSplash : UserControl
{
public PopupSplash()
{
InitializeComponent();
this.progressBar1.IsIndeterminate = true;//指示進度條是使用重複模式報告一般進度
}
}
}

MainPage.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using System.Windows.Controls.Primitives;
using System.ComponentModel;
using System.Threading;

namespace ProgressSplashScreen
{
public partial class MainPage : PhoneApplicationPage
{
private Popup popup;
private BackgroundWorker backroungWorker;
public MainPage()
{
InitializeComponent();
ShowPopup();
}
private void ShowPopup()
{
this.popup = new Popup();
this.popup.Child = new PopupSplash();//設定 Popup 控制項的內容,把自訂的PopupSplash控制項填充到popup控制項上
this.popup.IsOpen = true;
StartLoadingData();//開始載入資料
}

private void StartLoadingData()
{
//使用BackgroundWorker在單獨的線程上執行操作
backroungWorker = new BackgroundWorker();
//調用 RunWorkerAsync後台操作時引發此事件,即後台要處理的事情寫在這個事件裡面
backroungWorker.DoWork += new DoWorkEventHandler(backroungWorker_DoWork);
//當後台操作完成事件
backroungWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backroungWorker_RunWorkerCompleted);
//開始執行後台操作
backroungWorker.RunWorkerAsync();
}
//後台操作完成
void backroungWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.Dispatcher.BeginInvoke(() =>
{
this.popup.IsOpen = false;//關閉popup 注意要使用Dispatcher.BeginInvoke開跟UI通訊
}
);
}
//後台操作處理
void backroungWorker_DoWork(object sender, DoWorkEventArgs e)
{
// 程式初始化處理 這裡只是類比了一下
Thread.Sleep(7000);
}
}
}

System.Windows.Controls.Primitives.Popup 類

xaml文法

<Popup>
  Child
</Popup>

Popup 控制項可在單獨視窗中相對於螢幕上的元素或點顯示內容。當 Popup 可見時,IsOpen 屬性設定為 true。
Popup.Child 屬性

內容模型:Child 屬性是 Popup 控制項的唯一內容屬性。一個 Popup 只能有一個 UIElement 作為子級,但該子級可以包含複雜的嵌入內容。例如,該子級可以是包含 Image、文本和其他類型控制項的 StackPanel。 當將內容添加到 Popup 控制項時,Popup 控制項會成為該內容的邏輯父級。同樣,Popup 內容將被視為 Popup 的邏輯子級。不會將子內容添加到包含 Popup 控制項的視覺化樹狀結構中。但當 IsOpen 設定為 true 時,子內容將呈現在具有自身視覺化樹狀結構的單獨的視窗中。

System.ComponentModel. BackgroundWorker 類

BackgroundWorker 類允許您在單獨的專用線程上運行操作。耗時的操作(如下載和資料庫事務)在長時間運行時可能會導致使用者介面 (UI) 似乎處於停止回應狀態。如果您需要能進行響應的使用者介面,而且面臨與這類操作相關的長時間延遲,則可以使用 BackgroundWorker 類方便地解決問題。

若要在後台執行耗時的操作,請建立一個 BackgroundWorker,偵聽那些報告操作進度並在操作完成時發出訊號的事件。若要設定後台操作,請為 DoWork 事件添加一個事件處理常式。在此事件處理常式中調用耗時的操作。若要啟動該操作,請調用 RunWorkerAsync。若要收到進度更新通知,請對 ProgressChanged 事件進行處理。若要在操作完成時收到通知,請對 RunWorkerCompleted 事件進行處理。

注意
您必須非常小心,確保在 DoWork 事件處理常式中不操作任何使用介面物件。而應該通過 ProgressChanged 和 RunWorkerCompleted 事件與使用者介面進行通訊。

BackgroundWorker 事件不跨 AppDomain 邊界進行封送處理。請不要使用 BackgroundWorker 組件在多個 AppDomain 中執行多線程操作。
 如果後台操作需要參數,請在調用 RunWorkerAsync 時給出參數。在 DoWork 事件處理常式內部,可以從 DoWorkEventArgs.Argument 屬性中提取該參數。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.