首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我导航回页面时,一直按!DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION键

当我导航回页面时,一直按!DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION键
EN

Stack Overflow用户
提问于 2018-01-25 10:33:37
回答 1查看 189关注 0票数 0

我正在构建一个UWP应用程序。在我的一个页面上,我总是遇到标题中列出的异常。

这就是这个场景。应用程序将加载。我导航到我的运输页面(导致问题的那个页面),它加载正常。然后我导航到另一个页面,但是当我试图返回到运输页面时,我在App.g.i.cs文件中遇到了未处理的异常。

异常中唯一的消息是:“参数不正确。\r\n”

我不知道这是什么原因。如果我在后面的运输代码中的OnNavigatedTo事件的代码中放了一个断点,它会加载ViewModel,然后我就会遇到这个错误:

代码语言:javascript
复制
public ICommand TransitButtonCommand
{
    get
    {
        return _TransitButtonCommand ??
            new RelayCommand(() =>
            {
                _navigationService.Navigate(typeof(TransitView));
             });
    }
 }

解决这个问题的唯一方法是将: NavigationCacheMode="Required“放在运输视图的XAML文件中,但这并不是最优的,因为这个页面显示火车/公共汽车时刻表,而我需要在每次加载时更新它。

有人知道为什么会发生这种事吗?我很高兴从项目中提供更多的代码来帮助解决这个问题。

我的运输页面由一个SplitView组成,我根据选择的菜单项将另一个XAML页面加载到其中。

我创建了一个小项目,并将其放在GitHub上以演示此错误,您可以在此处找到它:https://github.com/marekt77/SplitViewBindingTest

运行应用程序,然后导航到SplitView页面,然后离开,然后再次返回,您将遇到错误。

EN

回答 1

Stack Overflow用户

发布于 2018-01-26 05:25:22

问题出在SplitViewPageViewModel中。PanelPage属性返回一个Page。当您第一次导航到SplitViewPage时,它会正确地将其绑定到内容,但下次,您将把它绑定到一个新的可视化树。作为您创建的第一个SplitViewPage的子项,PanelPage仍然停留在内存中。这将抛出一个异常,因为该页面是另一个元素的子元素。

您需要避免在视图模型中包含任何UI元素。它们会卡在内存中。

如果你没有其他选择,你只是想让它正常工作,这里有一个变通方法:

代码语言:javascript
复制
public class SplitViewPageViewModel : ViewModelBase
{
    private INavigationService _navigationService;

    public SplitViewPageViewModel(INavigationService navService)
    {
        _navigationService = navService;
        // construction removed here
    }

    private ICommand _OtherPageCommand;
    public ICommand OtherPageCommand
    {
        get
        {
            return _OtherPageCommand ??
                new RelayCommand(() =>
                {
                    _PanelPage = null; // <-- Added this
                    _navigationService.Navigate(typeof(OtherPage));
                });
        }
    }

    private ICommand _HomePageCommand;
    public ICommand HomePageCommand
    {
        get
        {
            return _HomePageCommand ??
                new RelayCommand(() =>
                {
                    _PanelPage = null; // <-- Added this
                    _navigationService.Navigate(typeof(HomePage));
                });
        }
    }

    private Page _PanelPage;
    public Page PanelPage
    {
        get
        {
            // build page on demand
            return _PanelPage ?? (_PanelPage = new Views.PanelPage());
        }
        set
        {
            _PanelPage = value;
            RaisePropertyChanged("PanelPage");
        }
    }
}

现在可以按需创建和处理面板页面。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48434741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档