在相同的Window WPF中切换视图而不创建页面的新实例

时间:2012-04-17 17:58:03

标签: c# .net wpf

我的应用程序有3个页面(一个MainWindow和2个页面,可以进行简单的选择)。

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

这个想法是我一次只能打开一个窗口。例如,当我从页面A导航到B时,B替换A的内容。顺序是始终A - > B - > C - > A(回到主窗口)或A - > B - >甲

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

这反过来导致必须使用很多我不喜欢的静态方法和类。

有没有更好的解决方案,不需要对我当前的应用程序导航结构进行全面检修?

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

提前致谢。

1 个答案:

答案 0 :(得分:7)

我真的不明白为什么你会在如此简单的设置中使用导航(3页和固定的导航结构)。更简单的方法是:

  1. 使用MainWindow作为内容占位符
  2. 将UserControls创建为页面
  3. 定义静态类以保存不同属性中的页面。如果需要,初始化它们(单例实例)。
  4. 使用MainWindow.SetPage(Pages.First)更改页面。
  5. 在代码中,这几乎看起来像这样:

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

    虽然如果你真的需要导航,你可以只使用它的静态部分并将单例实例传递给你的SwitchPage方法。