隐藏导航栏但记住wpf框架中的历史记录

时间:2013-12-08 06:59:22

标签: wpf xaml

我的主窗口上有一个框架。我有一个ItemsControl,在其中我显示垂直菜单,用户可以从中选择任何项目,并且框架中会显示与特定项目对应的页面。

这很有效。

当我将NavigationUIVisibility设置为Automatic时:

1) Navigation Bar is displayed at the top.
2) If I enter some data in a textbox in page1 and then if I navigate away to page2.
   Now again if I navigate to page1, the text in the textbox is there.

我想要的是:

1) Hide the Navigation bar. For that I have set NavigationUIVisibility to Hidden.
   This works good.
2) I want frame to remember history as I discussed in point 2 in above topic.
   So, How to remember history when NavigationUIVisibility is set to hidden.
   Or is there any other way to remember history when navigation bar is hidden.

3 个答案:

答案 0 :(得分:2)

您可以重新设置NavigationFrameNavigationWindow的样式,使它们看起来完全不同。事实上,以下所有这些图像都是NavigationWindow s,甚至根本没有任何导航UI。

enter image description here

我整理了一个开源库,用于在http://winchrome.codeplex.com重新设置这些样式,以便您可以从样式中窃取所需的部分。事实上,如果你只想要一个带左侧菜单的导航面板,那么它已经涵盖了该项目的一些演示。


回答你的问题TextBox清除它的原因很大程度上取决于你导航的内容,在某些情况下,这与历史无关。

让我们开始吧,让我们考虑一下MyPage.xaml

<Page x:class="MyPage"...>
  <TextBox/>
</Page>
  • 如果您导航到之前的MyPage,那么它仍将具有相同的值。
  • 如果您导航到new MyPage(),则默认情况下TextBox将为空。
  • 如果导航历史记录已开启,并且您正在向后导航,则会获得原始MyPage,因此在TextBox中看到相同的值。

现在让我们考虑一下我们是否使用绑定到ViewModel的MVVM样式视图。 在MyPage.xaml

<Page ...>
  <TextBox Text="{Binding MyData}"/>
</Page>

在DataViewModel.cs

public class DataViewModel : INotifyPropertyChanged
{
  private string myData;
  public string MyData 
  {
    get { return myData;} 
    set { ... }
  //Normal implementation of INotifyPropertyChanged etc for MVVM
}
  • 如果您导航到绑定到同一new Page()的{​​{1}},则两个ViewModel将始终保持同步并显示相同的数据。
  • 如果导航到Page并依赖ViewModel来创建视图,那么您仍然有两个视图,但都是从同一个ViewModel同步。
  • 如果您使用历史记录并向后导航,则会获得原始DataTemplate,因此请再次查看原始数据。

答案 1 :(得分:1)

Frame class有一个名为BackStack的属性,它保留了Frame的后退导航历史记录。无论NavigationUIVisibility设置如何,都可以使用此属性。

答案 2 :(得分:1)

使用PageFunction代替,这有助于您向后导航保留该页面的值..

的Page1.xaml:

<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="XYZ"
    x:TypeArguments="sys:String"
    Title="page1">

    <TextBox x:Name="textbox"/>
    <Button x:Name="button" Click="button_clicked"/>

</PageFunction>


private void button_clicked(object sender, RoutedEventArgs e)
{
     Page2 page2 = new Page2();
     page2.Return += page2_Return;
     this.NavigationService.Navigate(page2);
}

void page2_Return(object sender, ReturnEventArgs<String> e)
{
    OnReturn(new ReturnEventArgs<String>(null));
}

Page2.Xaml:

<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="PQR"
    x:TypeArguments="sys:String"
    Title="page2">

    ...


</PageFunction>


void BackButton_Click(object sender, RoutedEventArgs e)
{
    OnReturn(new ReturnEventArgs<String>(null));
}