C# 在同一窗口WPF中切换视图,而不创建页面的新实例

C# 在同一窗口WPF中切换视图,而不创建页面的新实例,c#,.net,wpf,C#,.net,Wpf,我的应用程序有3个页面(一个主窗口和2个简单选择页面) 目前,我使用以下导航结构在页面之间切换。 它基本上使用一个接口来传递页面的引用并创建新实例 我的想法是一次只能打开一个窗口。例如,当我从A页导航到B页时,B将替换A的内容。顺序始终为A->B->C->A(返回主窗口)或A->B->A 所有内容始终显示在一个窗口中,换句话说。 在我当前的解决方案中,我遇到了一个问题:每次切换页面时,我都会实例化一个新的页面实例(例如a->B->a的结果是新页面a()的2倍) 这又导致不得不使用很多我并不喜欢的

我的应用程序有3个页面(一个主窗口和2个简单选择页面)

目前,我使用以下导航结构在页面之间切换。 它基本上使用一个接口来传递页面的引用并创建新实例

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

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

这又导致不得不使用很多我并不喜欢的静态方法和类

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

在我当前的解决方案中,我使用一个静态ObversableCollection列表来记住动态创建的许多控件,因此当我返回到页面a(主窗口)时,一切都保持不变


提前谢谢。

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

  • 使用MainWindow作为内容占位符
  • 将用户控件创建为页面
  • 定义静态类以保存不同属性中的页面。如果需要,初始化它们(单例实例)
  • 使用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);
    

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

    我可能错了,但是当执行'this.Content=nextPage;'时,当前页面不会超出范围并被垃圾收集器清除,因此您实际上不会有多个实例您使用的解决方案对梅蒂来说似乎很好,但是我是否需要修改它?对于一个更合理的小导航,idd:)这取决于。您应该权衡这两种方法的优缺点。使用
    A
    B
    ,您指的是什么?@Tor Klingberg第一个和第二个“页面”。我尝试了这个方法,Visual studio大叫“不能在静态类中声明实例成员”。
    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***
    
    
            }
        }
    }