MainPage跳转SecondPage。
内容包含:页面跳转(Hyperlink,NavigationService),返回上一页,刷新当前页。
Page页面。
MainPage页面:
写了两种页面跳转方式
Hyperlink:通过给Hyperlink标签的属性跳转。
NavigationService(最佳推荐):通过代码形式实现跳转。
Hyperlink(超链接):是一种用于在WPF应用程序中创建和实现连接的控件。可以用在文字、图像、或其他UI元素上,以提供导航功能。关于更详细的介绍大家可以从网上查一下,在这里我只是做个简单的笔记。
Hyperlink控件也可以单独使用但大多情况下会报错,所以尽量嵌套。想知道为啥的自己查吧。
<Page x:Class="WpfApplication1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"
Title="MainPage">
<Grid>
<Border BorderBrush="BlanchedAlmond" BorderThickness="31">
<DockPanel >
<Label DockPanel.Dock="Top">MainPage页面</Label>
<StackPanel>
<Button Margin="5" BorderThickness="1" BorderBrush="Red">
<Hyperlink NavigateUri="SecondPage.Xaml">
通过属性直接跳转(不带参数)
</Hyperlink>
</Button>
<DockPanel Margin="5">
<Label>请输入要传输的参数:</Label>
<TextBox Name="textBox"></TextBox>
</DockPanel>
<Button Margin="5" Click="Button_Click">
<Hyperlink>
带参数传输方法
</Hyperlink>
</Button>
</StackPanel>
</DockPanel>
</Border>
</Grid>
</Page>
MainPage.cs(后台代码): 关键代码就一句 NavigationService.Navigate()引用命名空间:using System.Windows.Navigation;一般默认是引用这的,既然是做笔记所以就写进去了。
很多时候我们都需要使用 NavigationService 代替 Hyperlink.NavigateUri,比如非默认构造的 Page,动态确定目标页面等等。我们可以使用 Page.NavigationService 或者 NavigationService.GetNavigationService() 获得 NavigationService 的实例引用。
/// <summary>
/// MainPage.xaml 的交互逻辑
/// </summary>
public partial class MainPage : Page
{
//在 Page 上使用以下控件时,WPF 自动使用这一支持
//CheckBox、ComboBox、Expander、Frame、ListBox、ListBoxItem、MenuItem、ProgressBar、RadioButton、Slider、TabControl、TabItem、TextBox
//如果 Page 使用这些控件,将跨 Page 导航记住输入的数据,再点击返回按钮时应该会体会到,数据还在。
//当 Page 具有不同于前面所说的控件,或当状态存储在自定义对象中时,需要编写代码来使日志跨 Page 导航记住状态。
//如果需要跨 Page 导航记住小段状态,可以使用由 FrameworkPropertyMetadata.Journal 元数据标志配置的依赖属性(请参阅 DependencyProperty)。
//如果 Page 需要跨导航记住的状态包含多个数据段,可能会发现将状态封装在单个类中并实现 IProvideCustomContentState 接口会降低代码强度。
//如果需要在单个 Page 的不同状态中导航,而无需从 Page 自身导航,可以使用 IProvideCustomContentState 和 NavigationService.AddBackEntry。
//WPF存储数据的另一种方法是使用 cookie,可使用 SetCookie 和 GetCookie 方法来创建、更新和删除它。
//官网原话,没有实际演示有需求的以上当做扩展的一个方向可以试着操作一下。
public MainPage()
{
InitializeComponent();
}
//注释掉的可以先不看
private void Button_Click(object sender, RoutedEventArgs e)
{
SecondPage page = new SecondPage();
page.label.Content = textBox.Text;
//异步导航到某个对象中包含的内容。
this.NavigationService.Navigate(page);
//这是我从别的地方扒过来的,虽然能运行但是参数传不过去,好奇的可以研究研究。
//除了 Navigate(),还可以使用 NavigationService 的两个属性完成导航切换操作。
//获取或设置对包含当前内容的对象的引用。
//this.NavigationService.Content = page;
//获取或设置当前内容的统一资源标识符 (URI),或当前正在导航到的新内容的 URI。
//this.NavigationService.Source = new Uri("SecondPage.xaml", UriKind.Relative);
}
}
SecondPage页面:这个页面就更好理解了,如果传参数的话那就定义一个控件根据属性赋值就好了。
在在接收参数时用到了属性ContentStringFormat=‘’ 他跟C#里面的string.Format()意思是一样的。
比如说给变量赋值
例:
int count = 10;
ContentStringFormat = '总数量: {0}个';
呈现出来的效果就是:【总数量: {0}个】
用ContentStringFormat是为了取值时更加方便,不然得截取字符串或分割什么的一系列操作太繁琐了。
当前页面刷新功能:this.NavigationService.Refresh() 表示重新加载当前页面。
<Page x:Class="WpfApplication1.SecondPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"
Title="SecondPage" >
<Grid>
<Grid>
<Border BorderBrush="CadetBlue" BorderThickness="31">
<DockPanel>
<Label DockPanel.Dock="Top">SecondPage页面</Label>
<Label DockPanel.Dock="Top" Name="label" ContentStringFormat="获取MainPage页面的参数是:{0}"></Label>
<Button Click="Button_Refresh_Click">刷新当前页面(Refresh)</Button>
<Button Click="Button_Return_Click">返回(编程方式)</Button>
<Button>
<Hyperlink Command="NavigationCommands.BrowseBack">返回(绑定命令方式)</Hyperlink>
</Button>
</DockPanel>
</Border>
</Grid>
</Grid>
</Page>
/// <summary>
/// SecondPage.xaml 的交互逻辑
/// </summary>
public partial class SecondPage : Page
{
public SecondPage()
{
this.InitializeComponent();
}
/// <summary>
/// 刷新可以定义快捷键刷新比如F5
/// </summary>
private void Button_Refresh_Click(object sender, RoutedEventArgs e)
{
//页面重新加载
//this.NavigationService.Refresh();
label.Content = "点击按钮刷新的";
}
/// <summary>
/// 返回
/// </summary>
private void Button_Return_Click(object sender, RoutedEventArgs e)
{
NavigationService.GoBack();
}
}