在同一窗口 WPF 中切换视图,而不创建页面的新实例
本文关键字:创建 新实例 实例 WPF 窗口 视图 | 更新日期: 2023-09-27 18:31:36
MY 应用程序有 3 个页面(一个主窗口和 2 个进行简单选择的页面)。
目前,我使用以下导航结构在页面 http://azerdark.wordpress.com/2010/04/23/multi-page-application-in-wpf/之间切换。它基本上使用接口来传递页面的引用并创建新实例。
这个想法是我一次只能打开 1 个窗口。例如,当我从页面 A 导航到 B 时,B 替换了 A 的内容。顺序始终是 A -> B -> C -> A(返回主窗口)或 A -> B -> A。
换句话说,所有内容始终显示在一个窗口中。使用我当前的解决方案,我遇到了一个问题,即每次切换页面时我都会实例化页面的新实例(例如 A -> B -> A 的结果是 2x New PageA()。
这反过来导致不得不使用许多我不太喜欢的静态方法和类。
是否有更好的解决方案,不需要对我当前的应用程序导航结构进行全面检修?
在我当前的解决方案中,我使用静态 ObversableCollection 列表来记住许多动态创建的控件,因此当我返回页面 A (主窗口) 时,一切都保持不变。
提前谢谢。
我真的不明白为什么要在如此简单的设置(3 页和固定的导航结构)中使用导航。更简单的方法是:
- 使用主窗口作为内容占位符
- 将用户控件创建为页面
- 定义静态类以在不同属性中保存页面。如果需要,请初始化它们(单例实例)。
- 使用 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方法。
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***
}
}
}