继续点击!当我导航回页面时,DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION

时间:2018-01-25 02:33:37

标签: c# uwp uwp-xaml

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

这就是场景。该应用程序加载。我导航到我的Transit Page(引起问题的那个)并且它加载正常。然后我导航到另一个页面,但是当我尝试返回Transit页面时,我在App.g.i.cs文件中点击了那个未处理的异常。
异常中唯一的消息是:"参数不正确。\ r \ n"

我不知道造成这种情况的原因。如果我在后面的Transit代码中的OnNavigatedTo事件的代码中放了一个中断,它会加载ViewModel,然后我就点击了错误:

public ICommand TransitButtonCommand
{
    get
    {
        return _TransitButtonCommand ??
            new RelayCommand(() =>
            {
                _navigationService.Navigate(typeof(TransitView));
             });
    }
 }

解决这个问题的唯一方法是:NavigationCacheMode ="必需"在Transit视图XAML文件中,但这不是最佳的,因为此页面显示了列车/公交时刻表,我需要在每次加载时对其进行更新。

任何人都有任何想法为什么会这样?我很高兴再从项目中提供代码来帮助解决这个问题。

My Transit页面包含一个SplitView,我根据选择的菜单项将另一个XAML页面加载到其中。

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

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

1 个答案:

答案 0 :(得分:1)

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

您需要避免在视图模型中使用任何UI元素。他们被困在记忆中。

如果您没有其他选择而且您只想让这件事有效,那么这是一个解决方法:

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");
        }
    }
}

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