在 WPF 导航 NavigationWindow 中获取当前正在运行的页面
Posted
技术标签:
【中文标题】在 WPF 导航 NavigationWindow 中获取当前正在运行的页面【英文标题】:Get Current running page in WPF navigation NavigationWindow 【发布时间】:2011-11-22 17:39:14 【问题描述】:我是 WPF 新手, 我正在开发 WPF 的导航应用程序,
<NavigationWindow x:Class="KioskTraffic.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="768" Width="1024" Source="Home.xaml"
WindowState="Maximized" ResizeMode="NoResize" ShowsNavigationUI="False" WindowStyle="None" Cursor="Arrow" Closing="NavigationWindow_Closing"></NavigationWindow>
我有一些页面显示在这个导航窗口中,比如
<Page x:Class="KioskTraffic.Page1"
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"
Height="768" Width="1024"
Title="Page1">
如何知道 NavigationWindow.xaml.cs 文件下当前正在运行哪个页面?
我在此导航窗口中有一个计时器,它想检查当前页面是否为 home.xaml,然后我不想启动该计时器。
【问题讨论】:
问题需要更多的上下文和所有者的积极参与。 我已经以简单的方式编辑了我的问题,但仍在等待答案.... 【参考方案1】:您可以使用导航窗口的 CurrentSource 属性在后面的代码中获取当前正在运行的页面。根据您的要求,使用 NavigationService.Navigate() 方法完成,如下所示:
NavWindow.xaml:
<NavigationWindow x:Class="WPFTest.MyNavWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="768" Width="1024" Source="ShopList.xaml" Grid.Row="1"
WindowState="Maximized" ResizeMode="NoResize" ShowsNavigationUI="True" WindowStyle="SingleBorderWindow" Cursor="Arrow" Navigated="NavigationWindow_Navigated">
</NavigationWindow>
NavWindow.xaml.cs:
namespace WPFTest
public partial class MyNavWindow : NavigationWindow
public MyNavWindow()
InitializeComponent();
private void NavigationWindow_Navigated(object sender, NavigationEventArgs e)
MessageBox.Show(((NavigationWindow)this).CurrentSource.ToString());
ShopList.xaml:
<Page x:Class="WPFTest.ShopList"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="ShopList">
<Grid>
<Label Height="28" Margin="81,12,99,0" Name="label1" VerticalAlignment="Top" FontSize="16" FontWeight="Bold">Shop List</Label>
<Button Name="btnNext" Content="Go to Product list" Width="150" Height="30" Margin="0,50,0,0" Click="btnNext_Click"></Button>
</Grid>
ShopList.xaml.cs:
namespace WPFTest
public partial class ShopList : Page
public ShopList()
InitializeComponent();
private void btnNext_Click(object sender, RoutedEventArgs e)
NavigationService.Navigate(new System.Uri("ProductList.xaml", UriKind.Relative));
ProductList.xaml:
<Page x:Class="WPFTest.ProductList"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="ProductList">
<Grid>
<Label Height="28" Margin="81,12,99,0" Name="label1" VerticalAlignment="Top" FontSize="16" FontWeight="Bold">Product List</Label>
</Grid>
</Page>
它对我来说很好用。希望这能解决您的问题。请随时询问是否无法解决。
更新:
如果您想使用类名而不是 Uri 来导航页面,那么您可以获取当前源,例如:
MessageBox.Show(((NavigationWindow)this).NavigationService.Content.GetType().Name.ToString() + ".xaml");
【讨论】:
我在第一次加载第一个页面时收到错误“对象引用未设置实例的对象”,没关系,但是当我单击按钮“this.NavigationService.Navigate(new TimeoutDisplay( ));"它给了我那个错误。从我想获取页面名称的任何页面。 @ViralSarvaiya :您的代码中应该有 System.Uri("yourpage.xaml", UriKind.Relative) 而不是 TimeoutDisplay()。 我在这里上课而不是 URI。 是的,该错误来自以下行:MessageBox.Show(((NavigationWindow)this).CurrentSource.ToString());如果您使用类名而不是 Uri,那么您可以像我更新的答案一样。 @ViralSarvaiya:你的问题解决了吗还是继续?【参考方案2】:我遇到了类似的问题。 Upendra 在上面接受的答案引导我朝着正确的方向前进。我的问题是我在 FRAME 中使用不同的 WPF 页面。我需要确定框架内显示的页面。以下是我的想法。
Object CurrentPage;
private void LSK_1L_Click(object sender, RoutedEventArgs e)
CurrentPage = MCDU_Page_Frame.Content.GetType();
如果使用CurrentPage.ToString(),则CurrentPage对象成为加载页面的类名;
【讨论】:
【参考方案3】:我通过查看容器窗口的 NavigationService 的 Content 属性找到了当前页面。
【讨论】:
【参考方案4】:如果我们想知道当前页面显示在框架内的完整路径,那么我们可以使用它:
string currentpage = Myframe.CurrentSource.OriginalString.ToString().Replace("yoursolutionname;component/", "");
【讨论】:
【参考方案5】:在每个页面中使用页面加载事件来删除返回条目并仅显示当前页面
Inside Page Load 使用 NavigationService 函数 RemoveBackEntry()
【讨论】:
你能解释一下这是如何回答这个问题的吗?【参考方案6】:NavigationWindow
有一个名为 CurrentSource
的属性,它是最后导航页面的 URI
【讨论】:
但在 WPF 中它只给我 URI 是第一次而不是在那之后,我正在做 this.navigationservice.navigate(new MyNewpage());导航到另一个页面。以上是关于在 WPF 导航 NavigationWindow 中获取当前正在运行的页面的主要内容,如果未能解决你的问题,请参考以下文章
MFC 应用程序中的 WPF System.Windows.Navigation.NavigationWindow
WPF:第二次页面访问后 NavigationService 为 NULL