2012-04-17 133 views
2

我的应用程序有3个页面(一个MainWindow和2个页面,在这些页面中进行简单的选择)。在同一个窗口WPF中切换视图而不创建页面的新实例

当前我使用以下导航结构在页面http://azerdark.wordpress.com/2010/04/23/multi-page-application-in-wpf/之间切换。 它基本上使用一个接口来传递一个页面的引用并创建新的实例。

这个想法是我一次只能打开1个窗口。例如,当我从页面A导航到B时,B将替换A的内容。订单始终为A→B→C→A(返回主窗口)或A→B→A。

换句话说,所有内容都会一直显示在1个窗口中。 使用我当前的解决方案,我遇到了问题,我每次切换时都会实例化页面的一个新实例(例如A→B→A具有2x New PageA()作为结果)

在必须使用大量的静态方法和类的,我真的不喜欢。

是否有这更好的解决方案,不要求我的当前应用程序的导航结构的整个大修?

在我目前的解决方案我使用一个静态的ObversableCollection列表来记住一些动态创建的控件,所以当我回到页面A(mainWindow)时,一切都保持不变。

在此先感谢。

+1

我可能是错的,但是当'this.Content = nextPage;'被执行时不会使当前页面超出范围并被垃圾收集器清除,因此实际上不会有同一页面的多个实例。您使用的解决方案对我来说似乎相当不错 – 2012-04-17 18:16:40

回答

5

我不明白你为什么要在这样一个简单的设置(3页和固定导航结构)中使用导航。更简单的方法是:

  1. 使用主窗口的内容占位符
  2. 创建用户控件的页面
  3. 定义静态类持有不同的属性页面。如果需要,初始化它们(单例实例)。
  4. 使用MainWindow.SetPage(Pages.First)更改页面。

在代码中,这将几乎是这样的:

public class MainWindow : Window 
{ 
    // ... 
    public void SetPage(UserControl page) 
    { 
     this.Content = page; 
    } 
} 

// ... 

public static class Pages 
{ 
    private FirstUserControl _first; 
    private SecondUserControl _second; 
    private ThirdUserControl _third; 
    private MainWindow _window = Application.Current.MainWindow; 

    public UserControl First 
    { 
     get 
     { 
      if (_first == null) 
       _first = new FirstUserControl(); 
      return _first; 
     } 
    } 
    // ... 
} 

// Somewhere in B (after A -> B) 

    MainWindow.SetPage(Pages.First); 

但如果你真的需要导航,你可以只使用它的静态部分,并通过singletoned实例您SwitchPage方法。

+0

Ty为答复,我是否应该改变它呢? 对于一个小的导航,使更有意义idd :) – Rakr 2012-04-17 18:36:19

+0

这取决于。你应该权衡两种方法的优缺点。 – 2012-04-17 18:37:52

+0

你用'A'和'B'指的是什么? – 2016-02-18 15:42:15

1
public partial class MainWindow : Window 
{ 

    string un; 
    string pw; 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 

     un = txtName.Text; 
     pw = txtPw.Text; 

     if (un.Equals("steve") && pw.Equals ("cool")) 
     { 
      Home h= new Home(); 
      this.Content = h.Content; ***// this is where we change the window's contents*** 


     } 
    } 
} 
相关问题