举例来说:
母xaml文件里输入:
<navigation:Frame x:Name="ContentFrame" Style="{StaticResource ContentFrameStyle}"
Source="/Home" Navigated="ContentFrame_Navigated" NavigationFailed="ContentFrame_NavigationFailed">
<navigation:Frame.UriMapper>
<uriMapper:UriMapper>
<uriMapper:UriMapping Uri="" MappedUri="/Views/Home.xaml"/>
<uriMapper:UriMapping Uri="/{pageName}" MappedUri="/Views/{pageName}.xaml"/>
</uriMapper:UriMapper>
</navigation:Frame.UriMapper>
</navigation:Frame>
那么当该Navigation导航框架遇到无法识别的URI地址时,会调用NavigationFailed事件所对应的方法在当前母页面上打开一个子界面
这里new ErrorWindow(e.Uri); 会调用ErrorWindow.xaml.cs文件里的构造函数重载
// If an error occurs during navigation, show an error window
private void ContentFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)
{
e.Handled = true;
ChildWindow errorWin = new ErrorWindow(e.Uri);
errorWin.Show();
}
打开子UI界面ErrorWindow.xaml: 这里是个SIlverlight Child Window类型
<controls:ChildWindow
x:Class="TestDemo.ErrorWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"
Title="Error">
<Grid x:Name="LayoutRoot" Width="540">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock x:Name="IntroductoryText" Grid.Row="0" Margin="0"
Text="An unknown error was encountered. Please contact your administrator for more information."/>
<StackPanel x:Name="ContentStackPanel" Grid.Row="2" Margin="0,6,0,0">
<TextBlock x:Name="LabelText" TextWrapping="Wrap" Margin="0,0,0,2"
Text="Error details"/>
<TextBox x:Name="ErrorTextBox" Height="90" TextWrapping="Wrap" IsReadOnly="True"
VerticalScrollBarVisibility="Auto"/>
</StackPanel>
<Button x:Name="OKButton" Grid.Row="3" Click="OKButton_Click"
Width="75" Height="23" HorizontalAlignment="Right" Margin="0,10,0,0"
TabIndex="0" Content="OK"/>
</Grid>
</controls:ChildWindow>
子xaml.cs: 进行了构造函数重载
using System;
using System.Windows;
using System.Windows.Controls;
namespace TestDemo
{
public partial class ErrorWindow : ChildWindow
{
public ErrorWindow(Exception e)
{
InitializeComponent();
if (e != null)
{
ErrorTextBox.Text = e.Message + Environment.NewLine + Environment.NewLine + e.StackTrace;
}
}
public ErrorWindow(Uri uri)
{
InitializeComponent();
if (uri != null)
{
ErrorTextBox.Text = "Page not found: \"" + uri.ToString() + "\"";
}
}
public ErrorWindow(string message, string details)
{
InitializeComponent();
ErrorTextBox.Text = message + Environment.NewLine + Environment.NewLine + details;
}
private void OKButton_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = true;
}
}
}