如何在应用程序启动时创建页面的静态实例?

时间:2019-12-17 03:13:35

标签: c# .net wpf navigation instance

我目前有一个MainWindow,它充当浏览到解决方案中其他页面的框架。问题是,我需要在应用程序的整个过程中实例化我的页面之一,而不是每次导航到页面时都要实例化该页面。我已经为页面尝试了KeepAlive='true'属性,但是没有用。

我想知道是否有一种方法可以为我的代码实现“页面的静态实例”方法。谢谢。 (我不希望或计划实施MVVM方法)

        public MainWindow()
        {
            InitializeComponent();

            //Instanciate ApiStartup class and Initialize the HTTPClient
            ApiStartup.InitializeClient();
            Application.Current.MainWindow = this;
            Loaded += OnMainWindowLoaded;
        }

        private void OnMainWindowLoaded(object sender, RoutedEventArgs e)
        {
            ChangeView(new DetectionPage());
        }

        public void ChangeView(Page view)
        {  
            MainFrame.NavigationService.Navigate(view);
        }  

        private void quiz_Click(object sender, MouseButtonEventArgs e)
        {
            var mainWindow = (MainWindow)Application.Current.MainWindow;
            mainWindow?.ChangeView(new DetectionPage());
        }

2 个答案:

答案 0 :(得分:0)

如果要始终使用静态值在整个应用程序中使用,则可以在app.config文件中提及它。而且,您可以轻松地在任何xaml文件中使用((App)Application.current).KeepAlive

答案 1 :(得分:0)

页面具有keepalive属性。

https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.page.keepalive?view=netframework-4.8

您可以在任意页面上将其设置为true。 以后使用导航方法导航到该URL时,将返回页面的第一个实例。

如果由于任何原因都不适合,则可以使用具有键类型和值页面(实例)的字典来缓存页面实例。然后实施一些逻辑来决定您在其中缓存或不缓存的页面。

您说过您不想使用mvvm,但我认为最好至少提及几乎其他所有人都做的事情。对于打算在团队中工作的其他人,那么将期望使用MVVM,因此对于其他人,请阅读:

由于页面和框架带有日志和内存开销,这通常是不希望的,所以大多数团队(我已经遇到过)使用用户控件而不是页面。这些通过contentcontrol呈现。您可以将内容设置为用户控件,但是大多数团队首先使用视图模型。重要的状态是从视图模型的实例绑定和模板化的。为了在“导航”之间保留状态,将保留对视图模型的引用-几乎可以保证它在内存上比任何类型的视图都要轻。