8. 像我们在第一个page function里做过的一样,我们创建第二个功能页ContactDetailPage2,设定类型参数为Object。这个页面由两个TextBox组成,一个显示家庭地址,另一个显示公司地址。另外还添加一个Cancel和一个Finish按钮。
<PageFunction
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
x:Class="ContactDetailPage2"
x:TypeArguments="sys:Object"
Title="Contact Details - 2">
<Grid
Name="RootGrid"
VerticalAlignment="Center"
HorizontalAlignment="Center" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="200"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="110"/>
<RowDefinition Height="110"/>
<RowDefinition Height="60"/>
</Grid.RowDefinitions>
<!-- Labels -->
<TextBlock Width="100" Height="30"
Grid.Column="0" Grid.Row="1" > Business Address</TextBlock>
<TextBlock Width="100" Height="30"
Grid.Column="0" Grid.Row="2" > Home Address</TextBlock>
<!-- Input fields -->
<TextBox Name="txtHomeAddress" Width="200" Height="100"
Grid.Column="1" Grid.Row="1" TextWrapping="Wrap"
Text="{Binding Path=HomeAddress, Mode=TwoWay}"/>
<TextBox Name="txtBusinessAddress" Width="200" Height="100"
Grid.Column="1" Grid.Row="2" TextWrapping="Wrap"
Text="{Binding Path=BusinessAddress, Mode=TwoWay}"/>
<DockPanel Name="ButtonPanel1" Grid.Column="0" Grid.Row="3" >
<Button Name="btnBack" Width="100" Height="30"
Click="OnBackClick">Back</Button>
<Button Name="btnCancel" Width="100" Height="30"
Click="OnCancelClick">Cancel</Button>
</DockPanel>
<DockPanel Name="ButtonPanel2" Grid.Column="1" Grid.Row="3">
<Button Name="btnFinish" Width="100" Height="30"
Click="OnFinishClick">Finish</Button>
</DockPanel>
</Grid>
</PageFunction>
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
x:Class="ContactDetailPage2"
x:TypeArguments="sys:Object"
Title="Contact Details - 2">
<Grid
Name="RootGrid"
VerticalAlignment="Center"
HorizontalAlignment="Center" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="200"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="110"/>
<RowDefinition Height="110"/>
<RowDefinition Height="60"/>
</Grid.RowDefinitions>
<!-- Labels -->
<TextBlock Width="100" Height="30"
Grid.Column="0" Grid.Row="1" > Business Address</TextBlock>
<TextBlock Width="100" Height="30"
Grid.Column="0" Grid.Row="2" > Home Address</TextBlock>
<!-- Input fields -->
<TextBox Name="txtHomeAddress" Width="200" Height="100"
Grid.Column="1" Grid.Row="1" TextWrapping="Wrap"
Text="{Binding Path=HomeAddress, Mode=TwoWay}"/>
<TextBox Name="txtBusinessAddress" Width="200" Height="100"
Grid.Column="1" Grid.Row="2" TextWrapping="Wrap"
Text="{Binding Path=BusinessAddress, Mode=TwoWay}"/>
<DockPanel Name="ButtonPanel1" Grid.Column="0" Grid.Row="3" >
<Button Name="btnBack" Width="100" Height="30"
Click="OnBackClick">Back</Button>
<Button Name="btnCancel" Width="100" Height="30"
Click="OnCancelClick">Cancel</Button>
</DockPanel>
<DockPanel Name="ButtonPanel2" Grid.Column="1" Grid.Row="3">
<Button Name="btnFinish" Width="100" Height="30"
Click="OnFinishClick">Finish</Button>
</DockPanel>
</Grid>
</PageFunction>
9. ContactDetailPage2功能页的代码非常直观。再次强调要把类型参数改为Object。
Partial Public Class ContactDetailPage2
Inherits System.Windows.Navigation.PageFunction(Of Object)
Public Sub New()
InitializeComponent()
End Sub
' Create a ContactDetailPage2 with specified edit mode value.
' Since we won’t be displaying this page on the right hand side
' Frame, this constructor does not accept and use the index
' of selected element in the ContactList.
Public Sub New(ByVal editMode As Boolean, ByVal itemNumber As Integer)
InitializeComponent()
Me.KeepAlive = True
If (editMode = False) Then
Dim cl As ContactList = CType(Application.Current.Properties("ContactList"), ContactList)
Dim c As Contact = cl(0)
Me.RootGrid.DataContext = c
Me.ButtonPanel1.Visibility = Windows.Visibility.Hidden
Me.ButtonPanel2.Visibility = Windows.Visibility.Hidden
End If
End Sub
' Navigate back if the Back button is clicked
Private Sub OnBackClick(ByVal sender As Object, ByVal e As RoutedEventArgs)
System.Windows.Navigation.NavigationService.GetNavigationService(Me).GoBack()
End Sub
' Close window if Cancel button is clicked
Private Sub OnCancelClick(ByVal sender As Object, ByVal e As RoutedEventArgs)
CType((Me.Parent), NavigationWindow).Close()
End Sub
' When the Finish button is clicked, hydrate the Contact
' object with page data and return to our caller, which is
' ContactDetailPage1 page function.
Private Sub OnFinishClick(ByVal sender As Object, ByVal e As RoutedEventArgs)
Dim c As Contact = New Contact()
c.HomeAddress = Me.txtHomeAddress.Text
c.BusinessAddress = Me.txtBusinessAddress.Text
OnReturn(New ReturnEventArgs(Of Object)(c))
Dim w As Window = _
CType(Application.Current.Properties("AddContactWizard"), _
Window)
w.Close()
End Sub
End Class
Inherits System.Windows.Navigation.PageFunction(Of Object)
Public Sub New()
InitializeComponent()
End Sub
' Create a ContactDetailPage2 with specified edit mode value.
' Since we won’t be displaying this page on the right hand side
' Frame, this constructor does not accept and use the index
' of selected element in the ContactList.
Public Sub New(ByVal editMode As Boolean, ByVal itemNumber As Integer)
InitializeComponent()
Me.KeepAlive = True
If (editMode = False) Then
Dim cl As ContactList = CType(Application.Current.Properties("ContactList"), ContactList)
Dim c As Contact = cl(0)
Me.RootGrid.DataContext = c
Me.ButtonPanel1.Visibility = Windows.Visibility.Hidden
Me.ButtonPanel2.Visibility = Windows.Visibility.Hidden
End If
End Sub
' Navigate back if the Back button is clicked
Private Sub OnBackClick(ByVal sender As Object, ByVal e As RoutedEventArgs)
System.Windows.Navigation.NavigationService.GetNavigationService(Me).GoBack()
End Sub
' Close window if Cancel button is clicked
Private Sub OnCancelClick(ByVal sender As Object, ByVal e As RoutedEventArgs)
CType((Me.Parent), NavigationWindow).Close()
End Sub
' When the Finish button is clicked, hydrate the Contact
' object with page data and return to our caller, which is
' ContactDetailPage1 page function.
Private Sub OnFinishClick(ByVal sender As Object, ByVal e As RoutedEventArgs)
Dim c As Contact = New Contact()
c.HomeAddress = Me.txtHomeAddress.Text
c.BusinessAddress = Me.txtBusinessAddress.Text
OnReturn(New ReturnEventArgs(Of Object)(c))
Dim w As Window = _
CType(Application.Current.Properties("AddContactWizard"), _
Window)
w.Close()
End Sub
End Class