科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件Avalon应用程序中的导航技术分析

Avalon应用程序中的导航技术分析

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文将介绍Avalon应用程序的导航特性

作者:陶刚编译 来源:天极网 2007年11月4日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
向页面传递数据

  你已经看到了PageFunction页面是如何使用OnFinish()方法把值传递回调用页面。那么怎么把调用页面的值传递给PageFunction页面呢?在例子中,可以给目标PageFunction页面添加一个构造函数来实现。假设你需要给传递一个值,你就必须添加下面的构造函数:

Partial Public Class Page2
Inherits PageFunction(Of String)

Public Sub New()

End Sub

Public Sub New(ByVal data As String)
' 处理输入的数据
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

  请注意,你必须添加一个空的构造函数,否则在编译的时候就会遇到错误。同时,你可以根据自己的需要添加多个构造函数,只要它们的参数(信号)不同。

  为了给目标页面传递数据,在调用页面中你必须简单地提供必要的参数。

p2 = New Page2("the string to pass into")
p2.InitializeComponent()
navWindow.Navigate(p2)

  线性导航

  现在你已经知道了WPF应用程序中页面导航的一些基础知识了,现在我们来看一些重要的细节信息。在WPF中有两种主要的导航类型:

  ·线性的(Linear)

  ·层次的(Hierarchical)

  在线性导航中,所有的页面都串在一起,一个接一个地载入。图10显示了用线性方式链接在一起的三个页面。对于层次导航,页面链接的方式类似于树结构。在下一部分中我们会讨论层次导航的问题。


图10:线性导航。应用程序的这三个页面是线性关系。

  我现在建立一个简单的应用程序,演示线性导航是如何工作的。使用Visual Studio 2005建立一个新的WPF(Avalon)导航应用程序。有了默认的Page1.xaml页面中之后,再添加两个PageFunction页面,分别是Page2.xaml和Page3.xaml。我同时还会演示不同的PageFunction页面类型。

  填充Page1.xaml页面:

<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载入时候的样子。


图11:Page1.xaml。新应用程序的第一个页面,它将使用线性导航。

  在后台代码Page1.xaml.vb中添加下面的内容:

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)

' 导航到下一个页面
If sender.Equals(btnNextPage) Then
' 保存输入的名字
_Name = txtName.Text

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

' 退出应用程序
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
' 显示后一个窗体中输入的字符串
returnString.Text = "From Page 2: " & args.Result.ToString
End Sub

End Class

  在这个页面中需要重点注意的是:

  ·点击Next Page(下一页)按钮或Exit(退出)按钮的时候会调用ButtonClick()方法。

  ·如果点击了Next Page按钮,应用程序将导航到Page2.xaml。如果点击了Exit按钮,应用程序将退出。

  ·在应用程序导航到Page2.xaml之前,用户输入的名字必须保存在一个共享(shared)变量中。这是因为在两个页面之间导航(无论是编程或使用导航按钮)的时候,页面的状态是不会保存的。因此你必须维护自己的状态信息。

  ·无论页面在什么时候载入都会调用OnLoaded()方法,因此这是设置控件初始值/状态的位置。

  ·当Page2.xaml返回值的时候调用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>

  请注意,Page2.xaml是一个StringPageFunction,这意味着它会给调用页面返回一个字符串值。图12显示了Page2.xaml页面载入时候的样子。


图12:Page2.xaml。应用程序的第二个页面,它给第一个页面返回一个字符串。

  在后台代码Page2.xaml.vb中输入下面的内容:

Partial Public Class Page2
Inherits StringPageFunction
Public WithEvents nextPage As Page3

' 用于保存用户在页面中选择的公司名称
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)

 ' 导航到下一页
 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

 ' 退出应用程序
 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
 ' 显示后一个窗体中输入的字符串
 returnString.Text = "From Page 3: " & args.Result.ToString
End Sub

End Class

  基本上,Page2.xaml.vb与Page1.xaml.vb非常相似,除了点击Previous Page(前一页)按钮的时候,它使用OnFinish()方法给调用页面返回输入的公司名称。Next Page按钮引起应用程序导航到Page3.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>

  请注意Page3.xaml是一个BooleanPageFunction,它会给调用函数返回一个布尔型结果。图13显示了Page3.xaml载入时候的样子。


图13:Page3.xaml。这个应用程序的最后一个页面,它询问一个简单的布尔型值并返回第二个页面。

  在后台代码Page3.xaml.vb中添加下面的内容:

Partial Public Class Page3
Inherits BooleanPageFunction

' 用于保存页面中选择的状态
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

' 退出应用程序
If sender.Equals(btnExit) Then
 System.Windows.Application.Current.Shutdown()
End If
End Sub
End Class

  现在你可以运行应用程序并跟踪工作流程(图14所示)。


图14:应用程序流程。这个线性应用程序的三个页面按页面1、2、3的次序进行,按相反的次序返回。
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章