c# - 在不创建页面的新实例的情况下在同一 Window WPF 中切换 View

标签 c# .net wpf

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

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

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

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

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

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

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

提前致谢。

最佳答案

我真的不明白为什么要在如此简单的设置(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);

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

关于c# - 在不创建页面的新实例的情况下在同一 Window WPF 中切换 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10196445/

相关文章:

c# - 检测移动物体与静止物体之间的碰撞

c# - 如何将 ReactiveUI 与分层数据源( TreeView )一起使用

c# - 预加载所有程序集 (JIT)

c# - WPF 将函数注册为依赖属性

wpf - 从 WPF ListView 中拖动多个项目

c# - 在任务管理器的应用程序选项卡中设置应用程序名称

C# Web 服务 - 然后返回 最后 - 先发生什么

c# - 如何在显示 ContextMenuStrip 时接收鼠标移动事件?

.net - Microsoft CRM,如何使用 CrmService 获取列表的所有成员?

c# - 将文本绑定(bind)到组合框中的选定项目