繁体   English   中英

页面导航问题 C# WPF 混淆(内存)

[英]Problem with page navigation C# WPF with obfuscation (Memory)

由于要解析大量信息和 UI,我正在制作一个应用程序,其中包含每个页面大小约为 200 mb 的页面。

我正在尝试重用创建的页面以不使用大量 memory。

由于某种原因,垃圾收集器未释放 memory。

如果不创建新的页面实例,我找不到导航到新页面的方法。

我有一个 singleton NavigationManager。

internal class NavigationManager
    {
        private static NavigationManager _instance;
        public static NavigationManager Instance
        {
            get
            {
                if (_instance == null)
                {
                    _instance = new NavigationManager();
                }
                return _instance;
            }
        }

        private NavigationManager()
        {
            
        }

        private List<Page> pages = new();
        private Page temporaryPage;
        
        public void NavigateTo(string pageName, MainWindow mainWindow)
        {          
            if (pages.Any(p => p.Name == pageName))
            {
                mainWindow.MainFrame.NavigationService.Navigate(pages.First(p => p.Name == pageName));
            }
            else
            {
                temporaryPage = (Page)Activator.CreateInstance(Type.GetType($"MyApp.MVVM.View.{pageName}"));
                pages.Add(temporaryPage);
                mainWindow.MainFrame.NavigationService.Navigate(temporaryPage);
            }
        }
    }

并仅使用导航:

NavigationManager.Instance.NavigateTo(@"MainPages.MainPage", this);

但是在混淆之后我不能将 Type.GetType 与字符串一起使用,因为它不会只是找到它。没有混淆它工作正常。

有没有办法清除、删除、删除页面?

或者可以更正确地使用 Activator.CreateInstance(Type.GetType()) 进行混淆。

谢谢。

假设您需要混淆页面类型名称,因为您注意到您不能将Type.GetType与字符串一起使用。 相反,您可以做一些更简单的事情——只需传入Type 您的NavigateTo方法看起来像这样:

    public void NavigateTo(Type pageType, MainWindow mainWindow)
    {          
        var existing = pages.FirstOrDefault(p=>p.GetType() == pageType);
        if (existing != null)
        {
            mainWindow.MainFrame.NavigationService.Navigate(existing);
        }
        else
        {
            temporaryPage = (Page)Activator.CreateInstance(pageType);
            pages.Add(temporaryPage);
            mainWindow.MainFrame.NavigationService.Navigate(temporaryPage);
        }
    }

要称它为你会说

 NavigationManager.Instance.NavigateTo(typeof(MainPages.MainPage), this);

通过使用typeof并传递Type对象,您可以避免混淆,因为您的代码不再关心命名的内容。 老实说,即使没有混淆也是更好的练习。

不幸的是,我在这里看不到一些重构的方法,但这应该需要最少的重构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM