WPF Page导航(页面跳转+传参)

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();
        }
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值