国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

Avalon應(yīng)用程序中的導(dǎo)航技術(shù)分析

2019-11-17 04:41:12
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  用戶(hù)使用微軟的新Avalon UI框架組件和XAML(它是用于建立Avalon應(yīng)用程序的語(yǔ)言)可以建立不同類(lèi)型的應(yīng)用程序。本文將介紹Avalon應(yīng)用程序的導(dǎo)航特性。(請(qǐng)注重,從一開(kāi)始起,微軟就賦予Avalon一個(gè)永久的名稱(chēng):Windows顯示框架。在本文中,我們提及的WPF就是指Avalon)。

  WPF應(yīng)用程序可以被分成兩種類(lèi)型:

  ·獨(dú)立的Windows應(yīng)用程序

  ·包含一系列頁(yè)面的應(yīng)用程序

  后一種類(lèi)型(用戶(hù)在一系列頁(yè)面中導(dǎo)航)更加普遍。這種類(lèi)型的應(yīng)用程序中的導(dǎo)航元素是由Hyperlink(超鏈接)控件提供。但是Hyperlink控件也有一些缺點(diǎn),例如向目標(biāo)頁(yè)面?zhèn)鬟f值困難、確定目標(biāo)頁(yè)面什么時(shí)候返回到調(diào)用頁(yè)面的能力有限、給調(diào)用頁(yè)面?zhèn)鬟f值也很困難。

  因此,在本文中我將演示如何來(lái)處理這些問(wèn)題;我將建立一個(gè)WPF應(yīng)用程序,它從一個(gè)頁(yè)面導(dǎo)航到另一個(gè)頁(yè)面,在頁(yè)面之間傳遞值。

  導(dǎo)航的基礎(chǔ)知識(shí)

  在深入講解WPF中的頁(yè)面導(dǎo)航理論之前,我首先編寫(xiě)一個(gè)簡(jiǎn)單的應(yīng)用程序,解釋一些要害特性。首先,使用Visual Studio 2005建立一個(gè)新的WPF項(xiàng)目(我使用的是VB.NET),把這個(gè)應(yīng)用程序命名為AvalonNavigation(圖1所示)。

Avalon應(yīng)用程序中的導(dǎo)航技術(shù)分析
圖1:在Visual Studio 2005中建立一個(gè)新的WPF應(yīng)用程序

  解決方案治理器如圖2所示:

Avalon應(yīng)用程序中的導(dǎo)航技術(shù)分析
圖2:解決方案治理器中的內(nèi)容。你可以看到建立的新項(xiàng)目。

  首先我查看項(xiàng)目中的MyApp.xaml文件。Avalon導(dǎo)航應(yīng)用程序從<Navigationapplication> 根元素開(kāi)始。StartupUri屬性指定了應(yīng)用程序執(zhí)行時(shí)載入的頁(yè)面;在例子中,啟動(dòng)頁(yè)面是Page1.xaml:

<NavigationApplication x:Class="MyApp"
 xmlns="http://schemas.microsoft.com/winfx/avalon/2005"
 xmlns:x="http://schemas.microsoft.com/winfx/xaml/2005"
StartupUri="Page1.xaml"

<NavigationApplication.Resources>
</NavigationApplication.Resources>
</NavigationApplication>
Page1.xaml的內(nèi)容如下所示:
<Page x:Class="Page1"
 xmlns="http://schemas.microsoft.com/winfx/avalon/2005"
 xmlns:x="http://schemas.microsoft.com/winfx/xaml/2005"

<Grid>

</Grid>
</Page>
  現(xiàn)在給項(xiàng)目添加一個(gè)Avalon PageFunction項(xiàng):右鍵點(diǎn)擊解決方案治理器中的項(xiàng)目名稱(chēng),然后選擇“添加新項(xiàng)…”,并選擇Avalon PageFunction模板。把頁(yè)面的名稱(chēng)改成Page2.xaml并點(diǎn)擊“添加”(圖3所示)。

Avalon應(yīng)用程序中的導(dǎo)航技術(shù)分析
圖3:分頁(yè)。給項(xiàng)目添加一個(gè)新的Avalon PageFunction項(xiàng)

  Page2.xaml被加入項(xiàng)目之后,雙擊它來(lái)查看其內(nèi)容:

<PageFunction x:Class="Page2" x:TypeArguments="String"
 xmlns="http://schemas.microsoft.com/winfx/avalon/2005"
 xmlns:x="http://schemas.microsoft.com/winfx/xaml/2005"

<Grid>

</Grid>
</PageFunction>
  Avalon PageFunction是一個(gè)基本的WPF頁(yè)面,只是它會(huì)給調(diào)用頁(yè)面返回結(jié)果(因此稱(chēng)為頁(yè)面函數(shù))。圖4顯示了如何在Page1.xaml中使用Page2.xaml并獲取Page2.xaml返回的結(jié)果。

Avalon應(yīng)用程序中的導(dǎo)航技術(shù)分析
圖4:A到B。現(xiàn)在你可以從Page1.xaml導(dǎo)航到Page2.xaml。

  PageFunction頁(yè)面有四種類(lèi)型:

  ·BooleanPageFunction——返回一個(gè)布爾型的值;<BooleanPageFunction>元素描述它。

  ·Int32PageFunction——返回一個(gè)整型的值;<Int32PageFunction>元素描述它。

  ·ObjectPageFunction——返回一個(gè)對(duì)象值;<ObjectPageFunction>元素描述它。

  ·StringPageFunction——返回一個(gè)字符串;<StringPageFunction>元素描述它。進(jìn)入討論組討論。

  在Page2.xaml中,根元素是<PageFunction>,它并不在上述的四種頁(yè)面類(lèi)型之中。<PageFunction>是PageFunction頁(yè)面的通用版本,你需要用x:TypeArguments屬性(在例子中被設(shè)置為“String”)來(lái)指定它的類(lèi)型。假如你希望把該頁(yè)面轉(zhuǎn)換為上述四種類(lèi)型中的任意一個(gè)(例如StringPageFunction),可以簡(jiǎn)單地改變根元素,如下所示(請(qǐng)注重,x:TypeArguments屬性被刪除了):

<StringPageFunction x:Class="Page2"
 xmlns="http://schemas.microsoft.com/winfx/avalon/2005"
 xmlns:x="http://schemas.microsoft.com/winfx/xaml/2005"

<Grid>

</Grid>
</StringPageFunction>
  但是我現(xiàn)在還是使用原始的<PageFunction>根元素。

  用下面的內(nèi)容填充Page1.xaml:

<Page x:Class="Page1"
xmlns="http://schemas.microsoft.com/winfx/avalon/2005"
xmlns:x="http://schemas.microsoft.com/winfx/xaml/2005"

<StackPanel>

<Button Click="ButtonClick"
HorizontalAlignment="Left"
Margin="10,5,10,5"
Width="120">Go to Page 2
</Button>

<TextBlock Margin="10,5,10,5">
 <Inline Name="txtResult"></Inline>
</TextBlock>

</StackPanel>
</Page>
  基本上,這個(gè)頁(yè)面包含一個(gè)用于載入Page2.xaml的按鈕控件(圖5所示)和一個(gè)用于顯示Page2.xaml返回值的TextBlock控件(請(qǐng)注重第一次載入的時(shí)候TextBlock控件不可見(jiàn),因?yàn)樗鼪](méi)有包含任何值)。

Avalon應(yīng)用程序中的導(dǎo)航技術(shù)分析
圖5:Page1.xaml。按鈕控件載入應(yīng)用程序的第二個(gè)頁(yè)面。

  在Page1.xaml的后臺(tái)代碼——Page1.xaml.vb中加入的下面的內(nèi)容:

Partial Public Class Page1
Inherits Page
PRivate WithEvents p2 As Page2

Private Sub ButtonClick(ByVal sender As Object, _
ByVal e As RoutedEventArgs)

 Dim myApp As NavigationApplication
 Dim navWindow As NavigationWindow

 myApp = CType(System.Windows.Application.Current, NavigationApplication)
 navWindow = CType(myApp.MainWindow, NavigationWindow)

 p2 = New Page2
 p2.InitializeComponent()
 navWindow.Navigate(p2)
End Sub

Private Sub return_handler(ByVal sender As Object, _
ByVal e As ReturnEventArgs(Of String)) _
Handles p2.Return
 txtResult.Text = "Returned: " & e.Result.ToString
End Sub

End Class
  在Page1.xaml.vb中,我添加了兩個(gè)方法:

  ·ButtonClick——處理按鈕控件點(diǎn)擊事件。

  ·return_handler——檢索Page2.xaml返回的結(jié)果。

  假如要導(dǎo)航到某個(gè)PageFunction頁(yè)面,你必須建立目標(biāo)頁(yè)面的實(shí)例,調(diào)用它的InitializeComponent()方法,接著使用Navigate()方法導(dǎo)航到該頁(yè)面。當(dāng)目標(biāo)頁(yè)面函數(shù)返回值的時(shí)候,你從該頁(yè)面的Return(返回)事件中捕捉數(shù)據(jù)。返回的值可以通過(guò)ReturnEventArgs參數(shù)檢索到。

  現(xiàn)在我們填充Page2.xaml:

<PageFunction x:Class="Page2" x:TypeArguments="String"
xmlns="http://schemas.microsoft.com/winfx/avalon/2005"
xmlns:x="http://schemas.microsoft.com/winfx/xaml/2005"

<StackPanel HorizontalAlignment="Left">
<TextBlock Margin="10,5,10,5">
What is your name?</TextBlock>
<TextBox Name="txtName" Margin="10,5,10,5"
Width="200"></TextBox>
<Button Click="ButtonClick" Margin="10,5,10,5"
Width="60"
HorizontalAlignment="Left">Done</Button>
</StackPanel>
</PageFunction>
  Page2.xaml將顯示一個(gè)文本字符串,后面跟著一個(gè)文本框控件和按鈕控件(圖6所示)。它的目的是提示用戶(hù)輸入名字,接著把這個(gè)名字傳遞回Page1.xaml。


Avalon應(yīng)用程序中的導(dǎo)航技術(shù)分析
圖6:Page2.xaml。應(yīng)用程序的第二個(gè)頁(yè)面將要求用戶(hù)輸入,內(nèi)容會(huì)被傳遞回Page1.xaml。

  Page2.xaml.vb后臺(tái)的代碼如下:

Partial Public Class Page2
Inherits PageFunction(Of String)

Private Sub ButtonClick(ByVal sender As Object, _
ByVal e As RoutedEventArgs)
 OnFinish(New ReturnEventArgs(Of String)(txtName.Text))
End Sub
End Class
  請(qǐng)注重,Page2類(lèi)繼續(xù)自PageFunction類(lèi)(在XAML頁(yè)面中匹配了相應(yīng)的<PageFunction>元素);你也可以指定普通類(lèi)型(例子中是String)。

  當(dāng)我們點(diǎn)擊Done(完成)按鈕的時(shí)候,就使用OnFinish()方法返回輸入的名字。OnFinish()方法把指定的字符串返回給調(diào)用頁(yè)面(圖7所示)。

Avalon應(yīng)用程序中的導(dǎo)航技術(shù)分析
圖7:應(yīng)用程序流程。從頁(yè)面1到頁(yè)面2,然后返回,這個(gè)過(guò)程得到一個(gè)名字。

  在這個(gè)應(yīng)用程序中,導(dǎo)航按鈕的工作方式與瀏覽器中的導(dǎo)航按鈕的工作方式相似,可以讓你向前和向后訪問(wèn)頁(yè)面(圖8所示)。圖8中的“untitled”指向Page2.xaml。

Avalon應(yīng)用程序中的導(dǎo)航技術(shù)分析
圖8:前進(jìn)和后退。你可以查看應(yīng)用程序中頁(yè)面導(dǎo)航的歷史。

  所有載入過(guò)的頁(yè)面都會(huì)自動(dòng)地存儲(chǔ)在一個(gè)堆棧數(shù)據(jù)結(jié)構(gòu)(就是journal,導(dǎo)航日志)中。在某些情況下,你可能不希望在導(dǎo)航日志中記錄某些頁(yè)面(例如,為了防止用戶(hù)不小心導(dǎo)航到了某個(gè)作為事務(wù)部分的頁(yè)面,從而破壞了應(yīng)用程序的流程)。假如要手動(dòng)從導(dǎo)航日志中刪除某個(gè)頁(yè)面,就把它的RemoveFromJournal屬性設(shè)置為“true”:

' Page2.xaml
Private Sub ButtonClick(ByVal sender As Object, _
ByVal e As RoutedEventArgs)
Me.RemoveFromJournal = True
 OnFinish(New ReturnEventArgs(Of String)(txtName.Text))
End Sub
  這樣操作以后,Page2.xaml就不會(huì)顯示在導(dǎo)航按鈕中了(圖9所示)。

Avalon應(yīng)用程序中的導(dǎo)航技術(shù)分析
圖9:此處沒(méi)有后退。你可以從導(dǎo)航日志中刪掉一個(gè)頁(yè)面。
進(jìn)入討論組討論。
向頁(yè)面?zhèn)鬟f數(shù)據(jù)

  你已經(jīng)看到了PageFunction頁(yè)面是如何使用OnFinish()方法把值傳遞回調(diào)用頁(yè)面。那么怎么把調(diào)用頁(yè)面的值傳遞給PageFunction頁(yè)面呢?在例子中,可以給目標(biāo)PageFunction頁(yè)面添加一個(gè)構(gòu)造函數(shù)來(lái)實(shí)現(xiàn)。假設(shè)你需要給傳遞一個(gè)值,你就必須添加下面的構(gòu)造函數(shù):

Partial Public Class Page2
Inherits PageFunction(Of String)

Public Sub New()

End Sub

Public Sub New(ByVal data As String)
' 處理輸入的數(shù)據(jù)
End Sub

Private Sub ButtonClick(ByVal sender As Object, _
ByVal e As RoutedEventArgs)
 Me.RemoveFromJournal = True
 OnFinish(New ReturnEventArgs(Of String)(txtName.Text))
End Sub

End Class
  請(qǐng)注重,你必須添加一個(gè)空的構(gòu)造函數(shù),否則在編譯的時(shí)候就會(huì)碰到錯(cuò)誤。同時(shí),你可以根據(jù)自己的需要添加多個(gè)構(gòu)造函數(shù),只要它們的參數(shù)(信號(hào))不同。

  為了給目標(biāo)頁(yè)面?zhèn)鬟f數(shù)據(jù),在調(diào)用頁(yè)面中你必須簡(jiǎn)單地提供必要的參數(shù)。

p2 = New Page2("the string to pass into")
p2.InitializeComponent()
navWindow.Navigate(p2)
  線性導(dǎo)航

  現(xiàn)在你已經(jīng)知道了WPF應(yīng)用程序中頁(yè)面導(dǎo)航的一些基礎(chǔ)知識(shí)了,現(xiàn)在我們來(lái)看一些重要的細(xì)節(jié)信息。在WPF中有兩種主要的導(dǎo)航類(lèi)型:

  ·線性的(Linear)

  ·層次的(Hierarchical)

  在線性導(dǎo)航中,所有的頁(yè)面都串在一起,一個(gè)接一個(gè)地載入。圖10顯示了用線性方式鏈接在一起的三個(gè)頁(yè)面。對(duì)于層次導(dǎo)航,頁(yè)面鏈接的方式類(lèi)似于樹(shù)結(jié)構(gòu)。在下一部分中我們會(huì)討論層次導(dǎo)航的問(wèn)題。


Avalon應(yīng)用程序中的導(dǎo)航技術(shù)分析
圖10:線性導(dǎo)航。應(yīng)用程序的這三個(gè)頁(yè)面是線性關(guān)系。

  我現(xiàn)在建立一個(gè)簡(jiǎn)單的應(yīng)用程序,演示線性導(dǎo)航是如何工作的。使用Visual Studio 2005建立一個(gè)新的WPF(Avalon)導(dǎo)航應(yīng)用程序。有了默認(rèn)的Page1.xaml頁(yè)面中之后,再添加兩個(gè)PageFunction頁(yè)面,分別是Page2.xaml和Page3.xaml。我同時(shí)還會(huì)演示不同的PageFunction頁(yè)面類(lèi)型。

  填充Page1.xaml頁(yè)面:

<Page x:Class="Page1"
 xmlns="http://schemas.microsoft.com/winfx/avalon/2005"
 xmlns:x="http://schemas.microsoft.com/winfx/xaml/2005"

<DockPanel>
<StackPanel DockPanel.Dock="Left"
Background="LightBlue">
<TextBlock Margin="10,10,10,10">
Page 1</TextBlock>
</StackPanel>

<StackPanel DockPanel.Dock="Right"
Background="LightYellow">
<TextBlock Margin="10,10,10,10">
Enter your name</TextBlock>
<TextBox Name="txtName" Margin="10,10,10,10"
Width="200"
HorizontalAlignment="Left"></TextBox>

<Button Click="ButtonClick" Name="BTnNextPage"
 Margin="10,10,10,10" Width="80"
HorizontalAlignment="Left">Next Page</Button>
<Button Click="ButtonClick" Name="btnExit"
 Margin="10,10,10,10" Width="80"
HorizontalAlignment="Left">Exit</Button>

<TextBlock Margin="10,10,10,10">
<Inline Name="returnString" />
</TextBlock>
</StackPanel>
</DockPanel>
</Page>
  圖11顯示了Page1.xaml載入時(shí)候的樣子。

Avalon應(yīng)用程序中的導(dǎo)航技術(shù)分析
圖11:Page1.xaml。新應(yīng)用程序的第一個(gè)頁(yè)面,它將使用線性導(dǎo)航。

  在后臺(tái)代碼Page1.xaml.vb中添加下面的內(nèi)容:

Partial Public Class Page1
Inherits Page
Public WithEvents nextPage As Page2

' 用于保存輸入的名字
Private Shared _Name As String

Private Sub OnLoaded(ByVal sender As Object, _
ByVal e As RoutedEventArgs) Handles Me.Loaded
 txtName.Text = _Name
End Sub

Private Sub ButtonClick(ByVal sender As Object, _
ByVal e As RoutedEventArgs)

Dim myApp As NavigationApplication
Dim navWindow As NavigationWindow

myApp = CType(System.Windows.Application.Current, NavigationApplication)
navWindow = CType(myApp.MainWindow, NavigationWindow)

' 導(dǎo)航到下一個(gè)頁(yè)面
If sender.Equals(btnNextPage) Then
' 保存輸入的名字
_Name = txtName.Text

nextPage = New Page2
nextPage.InitializeComponent()
navWindow.Navigate(nextPage)
End If

' 退出應(yīng)用程序
If sender.Equals(btnExit) Then
System.Windows.Application.Current.Shutdown()
End If

End Sub

Private Sub nextPage_Return(ByVal sender As Object, _
ByVal args As StringReturnEventArgs) Handles _
nextPage.Return
' 顯示后一個(gè)窗體中輸入的字符串
returnString.Text = "From Page 2: " & args.Result.ToString
End Sub

End Class
  在這個(gè)頁(yè)面中需要重點(diǎn)注重的是:

  ·點(diǎn)擊Next Page(下一頁(yè))按鈕或Exit(退出)按鈕的時(shí)候會(huì)調(diào)用ButtonClick()方法。

  ·假如點(diǎn)擊了Next Page按鈕,應(yīng)用程序?qū)?dǎo)航到Page2.xaml。假如點(diǎn)擊了Exit按鈕,應(yīng)用程序?qū)⑼顺觥?br />
  ·在應(yīng)用程序?qū)Ш降絇age2.xaml之前,用戶(hù)輸入的名字必須保存在一個(gè)共享(shared)變量中。這是因?yàn)樵趦蓚€(gè)頁(yè)面之間導(dǎo)航(無(wú)論是編程或使用導(dǎo)航按鈕)的時(shí)候,頁(yè)面的狀態(tài)是不會(huì)保存的。因此你必須維護(hù)自己的狀態(tài)信息。

  ·無(wú)論頁(yè)面在什么時(shí)候載入都會(huì)調(diào)用OnLoaded()方法,因此這是設(shè)置控件初始值/狀態(tài)的位置。

  ·當(dāng)Page2.xaml返回值的時(shí)候調(diào)用nextPage_Return()方法。

  填充Page2.xaml:


<StringPageFunction x:Class="Page2"
xmlns="http://schemas.microsoft.com/winfx/avalon/2005"
xmlns:x="http://schemas.microsoft.com/winfx/xaml/2005"

<DockPanel>

<StackPanel DockPanel.Dock="Left"
Background="LightBlue">
<TextBlock Margin="10,10,10,10">
Page 2</TextBlock>
</StackPanel>

<StackPanel DockPanel.Dock="Right"
Background="LightYellow">

<TextBlock Margin="10,10,10,10">
Enter your company name</TextBlock>
<TextBox Name="txtCompanyName"
Margin="10,10,10,10"
Width="200" HorizontalAlignment="Left">
</TextBox>

<DockPanel>
<Button DockPanel.Dock="Left"
Click="ButtonClick"
Name="btnPreviousPage"
Margin="10,10,10,10"
Width="80" HorizontalAlignment="Left">
Previous Page</Button>

<Button DockPanel.Dock="Right"
Click="ButtonClick"
Name="btnNextPage" Margin="10,10,10,10"
Width="80" HorizontalAlignment="Left">
Next Page</Button>
</DockPanel>

<Button Click="ButtonClick" Name="btnExit"
Margin="10,10,10,10" Width="80"
HorizontalAlignment="Left">Exit</Button>

<TextBlock Margin="10,10,10,10">
<Inline Name="returnString" />
</TextBlock>

</StackPanel>
</DockPanel>
</StringPageFunction>
  請(qǐng)注重,Page2.xaml是一個(gè)StringPageFunction,這意味著它會(huì)給調(diào)用頁(yè)面返回一個(gè)字符串值。圖12顯示了Page2.xaml頁(yè)面載入時(shí)候的樣子。

Avalon應(yīng)用程序中的導(dǎo)航技術(shù)分析
圖12:Page2.xaml。應(yīng)用程序的第二個(gè)頁(yè)面,它給第一個(gè)頁(yè)面返回一個(gè)字符串。

  在后臺(tái)代碼Page2.xaml.vb中輸入下面的內(nèi)容:

Partial Public Class Page2
Inherits StringPageFunction
Public WithEvents nextPage As Page3

' 用于保存用戶(hù)在頁(yè)面中選擇的公司名稱(chēng)
Private Shared _CompanyName As String

Private Sub OnLoaded(ByVal sender As Object, _
ByVal e As RoutedEventArgs) Handles Me.Loaded
 txtCompanyName.Text = _CompanyName
End Sub

Private Sub ButtonClick(ByVal sender As Object, _
ByVal e As RoutedEventArgs)

 Dim myApp As NavigationApplication
 Dim navWindow As NavigationWindow

 myApp = CType(System.Windows.Application.Current, NavigationApplication)
 navWindow = CType(myApp.MainWindow,NavigationWindow)

 ' 導(dǎo)航到下一頁(yè)
 If sender.Equals(btnNextPage) Then
  _CompanyName = txtCompanyName.Text

  nextPage = New Page3
  nextPage.InitializeComponent()
  navWindow.Navigate(nextPage)
 End If

 If sender.Equals(btnPreviousPage) Then
  OnFinish(txtCompanyName.Text)
 End If

 ' 退出應(yīng)用程序
 If sender.Equals(btnExit) Then
  System.Windows.Application.Current.Shutdown()
 End If

End Sub

Private Sub nextPage_Return(ByVal sender As Object, _
ByVal args As BooleanReturnEventArgs) Handles _
nextPage.Return
 ' 顯示后一個(gè)窗體中輸入的字符串
 returnString.Text = "From Page 3: " & args.Result.ToString
End Sub

End Class
  基本上,Page2.xaml.vb與Page1.xaml.vb非常相似,除了點(diǎn)擊Previous Page(前一頁(yè))按鈕的時(shí)候,它使用OnFinish()方法給調(diào)用頁(yè)面返回輸入的公司名稱(chēng)。Next Page按鈕引起應(yīng)用程序?qū)Ш降絇age3.xaml。

  最后,填充Page3.xaml:


<BooleanPageFunction x:Class="Page3"
xmlns="http://schemas.microsoft.com/winfx/avalon/2005"
xmlns:x="http://schemas.microsoft.com/winfx/xaml/2005"

<DockPanel>
<StackPanel DockPanel.Dock="Left"
Background="LightBlue">
<TextBlock Margin="10,10,10,10">
Page 3</TextBlock>
</StackPanel>

<StackPanel DockPanel.Dock="Right"
Background="LightYellow">

<TextBlock Margin="10,10,10,10">
Single?</TextBlock>

<RadioButtonList Margin="10,10,10,10">
<RadioButton Name="rbTrue">True</RadioButton>
<RadioButton Name="rbFalse">False
</RadioButton>
</RadioButtonList>

<DockPanel>
<Button DockPanel.Dock="Left"
Click="ButtonClick"
Name="btnPreviousPage"
Margin="10,10,10,10"
Width="80" HorizontalAlignment="Left">
Previous Page</Button>
</DockPanel>

<Button Click="ButtonClick" Name="btnExit"
Margin="10,10,10,10" Width="80"
HorizontalAlignment="Left">Exit</Button>

</StackPanel>
</DockPanel>
</BooleanPageFunction>
  請(qǐng)注重Page3.xaml是一個(gè)BooleanPageFunction,它會(huì)給調(diào)用函數(shù)返回一個(gè)布爾型結(jié)果。圖13顯示了Page3.xaml載入時(shí)候的樣子。

Avalon應(yīng)用程序中的導(dǎo)航技術(shù)分析
圖13:Page3.xaml。這個(gè)應(yīng)用程序的最后一個(gè)頁(yè)面,它詢(xún)問(wèn)一個(gè)簡(jiǎn)單的布爾型值并返回第二個(gè)頁(yè)面。

  在后臺(tái)代碼Page3.xaml.vb中添加下面的內(nèi)容:

Partial Public Class Page3
Inherits BooleanPageFunction

' 用于保存頁(yè)面中選擇的狀態(tài)
Private Shared _Status As Boolean

' 示例事件處理程序
Private Sub OnLoaded(ByVal sender As Object, _
ByVal e As RoutedEventArgs) Handles Me.Loaded
 If _Status = True Then
  rbTrue.IsChecked = True
 Else
  rbFalse.IsChecked = True
 End If
End Sub

Private Sub ButtonClick(ByVal sender As Object, _
ByVal e As RoutedEventArgs)

If sender.Equals(btnPreviousPage) Then
 If rbTrue.IsChecked = True Then
  _Status = True
 Else
  _Status = False
 End If
 OnFinish(_Status)
End If

' 退出應(yīng)用程序
If sender.Equals(btnExit) Then
 System.Windows.Application.Current.Shutdown()
End If
End Sub
End Class
  現(xiàn)在你可以運(yùn)行應(yīng)用程序并跟蹤工作流程(圖14所示)。

Avalon應(yīng)用程序中的導(dǎo)航技術(shù)分析
圖14:應(yīng)用程序流程。這個(gè)線性應(yīng)用程序的三個(gè)頁(yè)面按頁(yè)面1、2、3的次序進(jìn)行,按相反的次序返回。
進(jìn)入討論組討論。
層次導(dǎo)航

  在帶有層次導(dǎo)航的WPF應(yīng)用程序中,用戶(hù)可以根據(jù)自己的選擇訪問(wèn)頁(yè)面。圖15顯示了一個(gè)典型的層次導(dǎo)航應(yīng)用程序。請(qǐng)注重,每個(gè)頁(yè)面都可以分支出多個(gè)頁(yè)面(根據(jù)需要),但是每個(gè)頁(yè)面退出的時(shí)候,它將返回調(diào)用自己的那個(gè)頁(yè)面。

Avalon應(yīng)用程序中的導(dǎo)航技術(shù)分析
圖15:三個(gè)頁(yè)面的層次。這個(gè)層次導(dǎo)航的應(yīng)用程序的頁(yè)面2和3返回頁(yè)面1。

  圖16顯示了圖15所示的分層導(dǎo)航應(yīng)用程序的一個(gè)示例實(shí)現(xiàn)。在第一個(gè)頁(yè)面中,用戶(hù)可以輸入名字并選擇國(guó)家,它可以點(diǎn)擊“Select Country”(選擇國(guó)家)按鈕載入第二個(gè)頁(yè)面。假如要選擇行業(yè),就點(diǎn)擊“Select Industry”(選擇行業(yè))按鈕載入第三個(gè)頁(yè)面。選擇國(guó)家和行業(yè)的頁(yè)面都返回第一個(gè)頁(yè)面(Page 1)。


Avalon應(yīng)用程序中的導(dǎo)航技術(shù)分析
圖16:兩個(gè)子頁(yè)面。層次導(dǎo)航應(yīng)用程序的一種實(shí)現(xiàn)。

  在你作出選擇之后,結(jié)果就顯示在主頁(yè)面上,它是整個(gè)應(yīng)用程序的主頁(yè)面(圖17所示)。

Avalon應(yīng)用程序中的導(dǎo)航技術(shù)分析
圖17:返回到開(kāi)頭。其它頁(yè)面中輸入的數(shù)據(jù)顯示在Page1.xaml中了。

  在本文中,你看到了Avalon分頁(yè)應(yīng)用程序的概述和兩個(gè)簡(jiǎn)單的例子。同時(shí)你還看到了五種可供使用的PageFunction頁(yè)面類(lèi)型。進(jìn)入討論組討論。


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 滕州市| 册亨县| 苍南县| 新源县| 大名县| 漠河县| 昂仁县| 九寨沟县| 澎湖县| 桐庐县| 绥化市| 临漳县| 汨罗市| 临猗县| 社旗县| 两当县| 三都| 开封县| 安西县| 德惠市| 丹江口市| 石柱| 育儿| 城步| 阿克苏市| 崇礼县| 灵石县| 大港区| 凤山市| 兴业县| 金川县| 长乐市| 溧阳市| 景宁| 兰西县| 浏阳市| 青海省| 静安区| 镇康县| 延安市| 资中县|