2013-12-08 81 views
0

我在我的主窗口上有一個框架。我有一個ItemsControl,在其中顯示垂直菜單,用戶可以從中選擇任何項目,並在框架中顯示與特定項目對應的頁面。隱藏導航欄,但記得在wpf框架中的歷史

這效果很好。

當我設置NavigationUIVisibility爲自動:

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. 
+0

我懷疑只有在通過導航欄導航時才保留「文本」,但如果使用代碼導航,則不會保留文本框文本。 –

回答

2

你可以重新設計NavigationFrame s和NavigationWindow s,使它們看起來完全不同。實際上,下面所有這些圖片都是NavigationWindow,即使是沒有任何導航UI的圖片。

enter image description here

我放在一起的開源庫再整理這些在http://winchrome.codeplex.com所以你可以偷你的風格需要的部分。事實上,如果你只是想在左邊有一個菜單的導航面板,那麼它已經在該項目的一些演示中進行了介紹。


要回答你的問題,爲什麼TextBox清除這取決於你正在瀏覽什麼非常多,對於某些情況下,這是獨立的歷史。

讓我們開始簡單地說,讓我們考慮我們有MyPage.xaml

<Page x:class="MyPage"...> 
    <TextBox/> 
</Page> 
  • 如果你導航到你是之前一樣MyPage,那麼它仍然有它的值相同。
  • 如果您正在導航到new MyPage(),那麼默認情況下,TextBox將爲空。
  • 如果導航歷史記錄已打開,並且您正在導航回去,那麼您將獲得原始的MyPage,因此在TextBox中查看相同的值。

現在讓我們考慮一下,如果我們使用綁定到ViewModels的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 
} 
  • 如果您導航到這勢必相同ViewModel一個new Page()那麼這兩個Page旨意始終保持同步,並顯示相同的數據。
  • 如果導航到ViewModel並依靠DataTemplate s創建一個視圖,那麼您仍然有兩個視圖,但都是從同一個ViewModel進行同步。
  • 如果您使用歷史記錄並向後導航,將獲得原始MyPage,以便再次查看原始數據。
1

Frame class有一個名爲BackStack屬性,它保留了一幀中的後退導航歷史記錄。無論NavigationUIVisibility設置如何,都可以使用此屬性。

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)); 
}