本文章是由機器翻譯。

UI 最前線

Windows Phone 7 中的頁面和快顯畫面

查爾斯 Petzold

下載程式碼範例

使用者和電腦的應用程式之間的互動,通常會繼續不會受到干擾。我們將文字輸入的文書處理器。數字和公式輸入試算表。與電子書讀取器中進行翻頁。但有時候,應用程式需要來自使用者的詳細資訊,或使用者啟始的作業,特別是用來提供其他資訊的應用程式。

在傳統的 Windows 應用程式中,我們都知道會發生什麼情況下一步:] 對話方塊隨即出現。[確定] 填寫並按一下,或如果您改變心意取消。

不會發生什麼事 Windows Phone 7 應用程式中是很清楚,但是。兩者都不在 Silverlight web 或 Silverlight 的 Windows Phone 不會那里存在任何項目稱為「 對話箱 」。我仍想要的詞彙來描述任何機制,可讓應用程式,以詢問使用者的資訊,但很明顯地 Silverlight 對話方塊稍有不同,從傳統的類型。

透過此資料行的過去幾篇,我已變得建置 Windows Phone 7 專案 Gutenberg 從下載的純文字活頁簿檔案為基礎的電子書讀取的器。遭人冒用增強大量的對話方塊與該程式的時間。

兩種方法

在實作 Silverlight 應用程式中的對話方塊,為 Windows Phone 7,有兩個選項。

可能是最明顯的方法是定義在單獨一頁] 對話方塊。從 PhoneApplicationPage 衍生新類別,並填入一堆按鈕和文字方塊和 whatnot。頁面再叫用這個對話方塊瀏覽到它使用網頁的 NavigationService 物件。[上一頁] 按鈕 (或其他項目) 結束] 對話方塊,並回到 [叫用它的網頁。

第二個選項是我所謂的 「 快顯 」 的方法。這種方法可以讓使用快顯功能表] 類別中,但是它不需要。(我將討論差異不久。) 這種對話方塊通常是衍生自使用者控制項並出現以視覺化方式叫用它,然後就消失不見,當使用者完成網頁的頂端與其互動式。瀏覽的相關資訊。

實作可瀏覽的網頁本身強制回應對話方塊。(強制回應對話方塊禁止與 [視窗] 或 [叫用它直到對話方塊關閉的頁面之間的互動)。使用快顯視窗的方法,對話方塊可以強制回應或非強制回應。強制回應快顯視窗的實作需要以確定快顯視窗在使用中時,無法與基礎網頁互動使用者的程式設計人員。在此情況下,更易於實作非強制回應快顯視窗,但通常戲法同時輸入從非強制回應對話方塊與基礎網頁的程序相當複雜。

開頭為我在我年 7 月的專欄中所呈現的 MiddlemarchReader 程式 (msdn.microsoft.com/magazine/hh288085),我的電子書的讀者已包含在清單方塊中顯示的章節清單的選項。然後您可以選取其中一個章節標題以跳至該章節的開頭。這即為對話方塊中,且我選擇它實作為快顯視窗,即使邏輯是有點混亂: ApplicationBar 按鈕,叫用快顯視窗也會關閉快顯視窗,提供服務,因此必須稍有不同的影像按鈕。

回顧以往,我應該已實作此對話方塊,為不同的頁面,而這就是如何完成我將在本文中說明的 HorrorReader 程式中。若要慶祝年 10 月和萬聖節,HorrorReader 可讓您讀取四個掠奪經典房車: 「 Frankenstein,""Dracula,""Dr。同時,Mr]。Hyde"和"開啟的螺絲,」 中所示圖 1。(電子書讀者下個月將最後展開潛在的程式庫以一些了 35000 的書籍,我保證 !)


圖 1] 的 HorrorReader MainPage 顯示

[Windows Phone 7] 在變更從快顯的章節清單方塊,可瀏覽的網頁,我搜尋深入我的心,試著了解為什麼我已經傾向於實作為快顯視窗的對話方塊。我已經發現意外的動機: 害怕。

瀏覽的的恐懼

如果您做任何 Windows Phone 7 程式設計都,您可能知道正在標記要刪除: 在某些情況下,執行的應用程式可以被終止,並從記憶體中移除。這樣當使用者按 [開始] 按鈕,在 [電話] 的 [開始],以檢視畫面中。電話尚未收到任何輸入一段,並進入鎖定的條件,其顯示關閉,或使用者以手動方式將關閉螢幕。

[上一頁] 當使用者解除鎖定螢幕或按下向後巡覽至程式的按鈕時,會重新啟動應用程式。Windows Phone 7 作業系統會顯示最後一個使用中的網頁,在應用程式,但在還原的任何其他的資訊完全是程式設計人員的責任。一般而言,頁面會儲存暫時性的資訊,而應用程式物件使用的 PhoneApplicationService 狀態字典來儲存暫時性的應用程式資料,以及隔離儲存區永久的資料,關聯資料頁中,使用 PhoneApplicationPage 狀態字典。

在撰寫的程式碼正在標記要刪除,程式設計人員可以覆寫頁面以儲存網頁資訊 」 和 「 還原這項資訊的 OnNavigatedTo 的 OnNavigatedFrom 方法。。標記的程式時,這是沒問題或正在恢復後被標記。但是,如果網頁是簡單的過程中瀏覽到另一個頁面,或從該瀏覽,然後儲存和還原網頁資訊是沒有必要。相關資訊的數量,根據這個額外的活動可能會減緩向上頁面巡覽明顯。

若要避免這個額外的活動的方法之一是只要一頁將應用程式限制和實作的快顯視窗與對話方塊!這是我沒有在舊版的電子書讀取器。我會避免頁面巡覽,因為我所向無敵減緩正在標記要刪除的程式碼。

但這是很蠢。它的確只問題如果正在實作中有什麼我現在將視為 「 無聲的方法 」!網頁不應該儲存大量的狀態資訊,除非應用程式真正的標記,而且它不應該嘗試還原該資訊,除非它被從標記狀態恢復。Windows Phone 7.1 會提供額外的資訊,以更有效地實作這些方法會巡覽,覆寫。同時,您可以在應用程式類別,也就是主要負責處理由 PhoneApplicationService 所實作的事件而所有事半功倍。這些事件真正表示標記或 revived,是否正被應用程式。

它是通常有幫助加強向上 OnNavigatedTo 覆寫。這個邏輯可能很簡單: 如果某個特定欄位是 null,它必須重新產生。 如果不是 null,然後是相同,因為應用程式不是標記以前瀏覽。

結構的 HorrorReader

在 HorrorReader 中的應用程式檔案有兩個公用屬性參考儲存在隔離儲存區中的物件。第一個和 AppSettings,儲存應用程式設定套用到所有的書籍。其中包括字型系列、 字型大小和網頁切換的樣式。第二,應用程式的 CurrentBook 屬性物件的型別 BookInfo,都有所有的個別活頁簿相關內容,請包括實際活頁簿,目前的章節和頁面、 儲存重新編頁資料及集合的書籤] 和 [註釋] 是與此版本的 ChapterInfo 物件的集合的檔名。媒體櫃中寫過四本書的每一個都有其本身的 BookInfo 物件儲存在隔離儲存區,但除非您先讀過這本書,這個 BookInfo 物件並不會建立。

HorrorReader 有六個從 PhoneApplicationPage 衍生的類別。這些類別會在所有 HorrorReader 專案的一部分,而且都很容易辨識,其名稱的字 「 頁 」。。除了從應用程式中,所有其他類別位於 Petzold.Phone.EBookReader 的動態連結程式庫。

如您所見的圖 1,MainPage 有四個按鈕,可讓您選取其中一個四個可用的書籍。(這個頁面會取代在下個月的版本的程式)。當使用者按一下其中一個按鈕時,MainPage 巡覽至 BookViewerPage,也就是主要負責裝載 BookViewer 控制項,並實作數個快顯視窗。

BookViewerPage 有四個 ApplicationBar 按鈕。前三個會造成瀏覽至其他網頁: ChaptersPage,BookmarksPage 和 AnnotationsPage。書籤是只要有使用者輸入一個標籤的通訊錄] 中的特定頁面的參考。附註,則伴隨選用的附註文字選取範圍。每個三個網頁包含清單方塊,和每個會造成 BookViewerPage,跳至活頁簿中的新頁面。

在 BookViewerPage 中的 [ApplicationBar] 功能表有三個項目: 「 較小的文字 」,「 較大的文字 」 和 「 設定 」。前兩個增量 10%,會導致字型大小的變更,並巡覽至 SettingsPage,實作選取字型和您想要的頁面轉換,樞紐分析表控制項中所示的 「 設定 」 圖 2。在頁面底部的文字為所選字型的預覽。


2 字型選取項目的設定樞紐分析圖

使用此頁面上,我遇到明顯的衝突,GestureListener 類別與滑桿從 Windows Phone 工具組。我必須實作自己的滑桿,並處理序中只會以百分之十為增量單位跳躍。

我不完全滿意的 PhoneApplicationPage 衍生項目使用對話方塊。我喜歡較結構化的方式,將資訊傳遞至一個對話方塊,並取回資訊。此傳輸的資料通常會變成瀏覽結構中有些甚純熟。比方說,我會已經偏好來將目前的活頁簿的參考傳遞至 ChaptersPage,BookViewerPage 和 ChaptersPage 傳回至 BookViewerPage 使用者所選取的章節。換句話說,我想要使用更多,而沒有副作用的函式的 ChaptersPage。也許有一天我會設計,讓我執行這項操作的 PhoneApplicationPage 的包裝函式。同時,HorrorReader,我只是對共用資料的參考相同的 CurrentBook 屬性,在應用程式類別中的所有頁面。

顯示或跳現式嗎?

雖然我採用的章節清單]、 [書籤清單]、 [註釋清單] 及 [設定 PhoneApplicationPage 衍生項目,但我仍需要數種快顯視窗。

基本上有兩種方法可以實作 Silverlight 的 Windows Phone 中的快顯視窗。一種方法是將控制項 (或更常見使用者控制項衍生項目) 只是頁面的視覺化樹狀結構中的權限。[可見性] 這個控制項位於最上層的所有項目,但其屬性會初始化為摺疊。當需要快顯快顯視窗時,只需設定可見性] 屬性為 [可見。

為強制回應快顯視窗中,您也要停用頁面上的其他所有項目。您可以藉由基礎控制項的 IsEnabled 屬性設定為 false,或另外設定 IsHitTestVisible 屬性為 false。這兩個屬性很類似,但是 IsHitTestEnabled 也可以搭配 FrameworkElement 衍生項目,例如面板時,IsEnabled 會限定為控制項。IsEnabled 屬性也會造成某些控制項會出變暗。另一個選擇是要讓具有透明背景快顯畫面區塊觸控輸入。不論何種技術使用,您將可能也需要停用 ApplicationBar。(需這個小問題很快就。)

替代方法是使用快顯功能表項目。快顯功能表項目具有子屬性,您可能會將使用者控制項衍生項目。(我真希望我無法從快顯功能表,但它的衍生密封。) [IsOpen] 根據預設,快顯功能表的屬性為 false,和您將它設為 true,可讓快顯視窗的子系看得見]。快顯功能表中也有方便 HorizontalOffset 和 VerticalOffset 屬性,可讓您將子系。

一個有趣的方面,快顯功能表的是它並不需要父項目。換句話說,它沒有視覺化樹狀結構的一部分。您可以只在程式碼建立跳現式物件,設定子屬性,設定 IsOpen 屬性為 true,它會以視覺化方式顯示其餘的上方。

小心,不過。如果快顯功能表沒有父代,HorizontalOffset 和 VerticalOffset 屬性會是相對於 PhoneApplicationFrame 物件,在概念上來說下所有的 PhoneApplicationPage 物件的左上角。框架包含系統匣頂端的畫面中,但快顯視窗將不會顯示在系統匣的上方。如果可以看到系統匣,快顯功能表的子系會加以裁剪頂端。覆疊 PhoneApplicationPage 組件會顯示。請將 VerticalOffset 屬性設定為非零值,以容納系統匣。

沒有父快顯功能表的優點是方便進行強制回應。您只要將 PhoneApplicationPage 衍生項目中的 [IsEnabled] 屬性設定為 false,並有效地停用一次在頁面上的一切。

結果糟糕,不會是很好嗎?事實上,它不會發生,因為 ApplicationBar 不是頁面的視覺化樹狀結構的一部分。您必須分別停用 ApplicationBar。它具有便利的 IsMenuEnabled 屬性,但不含單一屬性以停用的按鈕。您必須個別處理這些按鈕。

為兩個我所需的快顯視窗中,我想要將它們移至不同的位置,相對於頁面。快顯功能表的子系對話方塊時非常簡單。否則,您必須在對話方塊控制項上的 TranslateTransform。若要簡化正在標記要刪除,我決定一致,並使用我的所有快顯快顯功能表項目。我也決定頁面的視覺化樹狀結構中定義每個快顯功能表和子系。HorizontalOffset 和 VerticalOffset 屬性因此是相對於頁,而非框架。

這些快顯視窗是名為"textSelectionMenu,」 BookViewerPage.xaml 中所定義的清單方塊。這是出現時請選取文字,如我在我年 9 月的專欄中所述的功能表 (msdn.microsoft.com/magazine/hh394142)。其中一個選項是 「 附註 」,這會叫用另一個名為 AnnotationDialog 的使用者控制項衍生項目所定義的快顯視窗。。這可讓使用者輸入的附註、,如所示圖 3


圖 3 AnnotationDialog 快顯視窗

您可以定義新的書籤發狂似手指向上或向下的網頁。BookmarkDialog 可讓您輸入的標籤。

BookmarkDialog 和 AnnotationDialog 可以也會出現,分別在 BookmarksPage 和 AnnotationsPage 來編輯現有的項目。您也可以刪除的書籤] 或 [附註在這些網頁,以及所叫用另一個稱為 OkCancelDialog 的快顯視窗。除了出現時,它並不能使雜音,這是標準的訊息方塊中 Windows Phone 7,可以使用類似。

[ApplicationBar] 的最後的快顯視窗是 FindDialog,叫用的第四個按鈕,並顯示在圖 4。這可讓您熟悉的選項與通訊錄] 中的文字搜尋。每個相符,文字會反白顯示,FindDialog 會跳到頂端或底端的頁面,以讓反白顯示的文字會顯示。


圖 4 所 FindDialog 的快顯視窗

正在標記要刪除的快顯視窗

快顯視窗也應該配合正在標記要刪除嗎?以下是我自己所造成的案例: 我正在搜尋中的活頁簿使用 [跳現式] 對話方塊中顯示某些文字假設圖 4。然後我設定電話向下的資料表。幾分鐘後,我接電話,並已鎖定螢幕。[開啟] 我按按鈕,並掃除向上底色圖案。離開我 FindDialog 仍應該顯示在狀態吗?

我不願意答案是: 當然。我必須確認這是使用者所預期的這是應發生的事情。也就是說,快顯視窗需要標記。

因此,在任何網頁裝載快顯功能表中,我定義快顯功能表名為 activePopup,它會設定時才會有快顯型別的欄位。如果這個欄位設定呼叫 OnNavigationFrom 時,它只代表程式正被標記,因為其他項目已停用時才會有快顯視窗。在這種情況下,網頁會將快顯功能表的名稱儲存網頁的狀態字典中。它還會檢查快顯視窗的子系是否實作 ITombstonable 介面,我使用兩個方法定義: SaveState 和 RestoreState。這是 AnnotationDialog、 BookmarkDialog、 OkCancelDialog 及 FindDialog 對話方塊快顯方式儲存,並將其目前的狀態還原期間正在標記要刪除。

上一步] 按鈕覆寫

我寫了整個活頁簿的 Windows Phone 7 程式設計,我忘了併入的覆寫由 PhoneApplicationPage 所定義的 OnBackKeyPress 方法即使只有一個範例。很蠢我。這個方法中所參考的 [上一頁] 鍵是最左邊的 [在電話上的三個硬體按鈕。[上一頁] 根據預設,按鈕從頁面巡覽至網頁叫用它。[上一頁] 如果應用程式及其主要頁面上,然後按鈕以結束程式。

[上一頁] 我已實作各種對話方塊中的快顯表單,如它肯定寄給我,我需要而經常覆寫按鈕的行為。一般規則如下: 當使用者將發送 [上一頁] 按鈕,而不需離開頁面,或結束應用程式要能想到,您應該覆寫 OnBackKeyPress。

可以裝載快顯畫面的任何頁面,並在這個案例中,BookViewerPage、 AnnotationsPage 和 BookmarksPage — 應該覆寫 [上一頁] [關閉視窗] 鍵來關閉快顯視窗,如同按一下按鈕在傳統的對話方塊。OnBackKeyPress 方法的引數是執行個體的 CancelEventArgs。將 [取消] 屬性設定為,則為 true 的可禁止執行其一般的瀏覽函式的 [上一頁] 鍵。

如果快顯視窗是作用中而且快顯視窗上的文字方塊具有輸入的焦點,則會在螢幕上顯示鍵盤。[上一頁] 這一次按鍵,自動解除鍵盤。按 [上一步一次應該關閉快顯視窗。一次按上一步,您會返回前一頁。[上一頁] 在所有情況下,大為視覺上的變更提供良好的意見反應給使用者,按下鍵時,實際上沒有項目。

注意在覆寫 OnBackKeyPress。[上一頁] 它應該會卡在迴圈連續按下的按鈕不在其中終止應用程式的使用者可能!如果發生這種情況,將永遠不會到 Windows Phone 7 服務商場取得的程式。

供前端

在程式設計中,有差別通常大支援的某些實體的一個執行個體,以及支援多個執行個體。除了不同的網頁和 HorrorReader 中的快顯視窗,程式有約定大大幅我先前的電子書讀者可讓您讀取寫過四本書而不只一個。每一本書會有其本身儲存在隔離的記憶體,所以每本書會獨立於所有其他的 BookInfo 物件。

現在,所有必要是取代新前端,可讓您從專案 Gutenberg 網站下載活頁簿中的 MainPage。不進行其他變更都應該是必要的。這應該簡單、 權限吗?

Charles Petzold* 是 longtime 特約編輯* MSDN Magazine*.*  他最近使用的活頁簿,「 程式設計 Windows Phone 7 」 (微軟出版品,2010年),就可以免費下載在作為 bit.ly/cpebookpdf。本月將標示的 MSDN 雜誌的 Petzold 的貢獻 25 週年紀念日 ,其前置任務, Microsoft 系統日誌*.*

感謝給下列技術專家來檢閱這份文件: Richard Bailey