1

Final ОбновлениеCOMException в WinRT приложение манипулируя backstack

Я нашел эту проблему. Это не имеет никакого отношения к манипулированию задним ходом. Причиной был словарь ресурсов, который я не зарегистрировал правильно.


Я пишу приложение Windows Phone 8.1. Поскольку я использую MVVMcross, у меня есть классическая настройка проекта: портативный проект, который содержит ViewModels и проект Windows Phone 8.1, который содержит Views.

В некоторых случаях я хочу удалить страницу из задней части экрана, чтобы страница перед удаленной страницей отображалась, когда я нажимаю на подставку.

Для достижения такого поведения я следовал одна примера: https://edsnider.net/2014/04/07/clearing-windows-phone-nav-back-stack-in-mvvmcross/

Все работает хорошо, за исключением того, когда я делаю полный перезапуск, когда я нахожусь в приложении и снова откройте приложение снова. В этом случае я получаю исключение COM, когда я делаю манипуляции с задней загрузкой:

The operation identifier is not valid. 
The BackStack or ForwardStack cannot be changed while navigating. 

Вопрос: Что не так с моим кодом?

Вот соответствующие фрагменты кода:

Метод DropPageAndShowViewModel определен в базовом классе моего ViewModels. Исключение происходит, когда я называю этот метод в ViewModel:

DropPageAndShowViewModel<TourdatenSummaryViewModel>(
    new TourdatenSummaryViewModel.NavObject 
    { 
     Tournummer = _tour.Nummer 
    }); 

Это базовый класс моих ViewModels. BaseViewModel происходит от MvxViewModel.

public class BasePageViewModel : BaseViewModel 
{ 
    ... 

    protected void DropPageAndShowViewModel<TViewModel>() 
     where TViewModel : BasePageViewModel 
    { 
     ShowViewModel<TViewModel>(); 
     ChangePresentation(new DropCurrentBackStackEntryHint()); 
    } 

    protected void DropPageAndShowViewModel<TViewModel>(object parameterValuesObject) 
     where TViewModel : BasePageViewModel 
    { 
     ShowViewModel<TViewModel>(parameterValuesObject); 
     ChangePresentation(new DropCurrentBackStackEntryHint()); 
    } 
} 

Это CustomViewPresenter, который делает манипуляцию backstack:

public class DropCurrentBackStackEntryHint : MvxPresentationHint 
{ 
} 


public class CustomViewPresenter : MvxWindowsViewPresenter 
{ 
    private readonly IMvxWindowsFrame _rootFrame; 

    public CustomViewPresenter(IMvxWindowsFrame rootFrame) : base(rootFrame) 
    { 
     _rootFrame = rootFrame; 
    } 

    protected Frame RootFrame 
    { 
     get { return (Frame) _rootFrame.UnderlyingControl; } 
    } 

    public override void ChangePresentation(MvxPresentationHint hint) 
    { 
     if (hint is DropCurrentBackStackEntryHint) 
     { 
      if (RootFrame.BackStack.Any()) 
      { 
       RootFrame.BackStack.RemoveAt(RootFrame.BackStackDepth - 1); 
      } 
     } 
     base.ChangePresentation(hint); 
    } 
} 

я нашел только одну ссылку на этот COM исключение в Интернете, но не было полезно для меня: https://github.com/Windows-XAML/Template10/issues/454

Обновление

Я получаю необработанное исключение в этот обработчик:

void App_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    if (Debugger.IsAttached) 
     Debugger.Break(); 

    e.Handled = true; 

    var message = "Error: \n\n" + 
     e.Message + "\n\n" + 
     e.Exception.HResult + "\n\n" + 
     e.Exception.Message + "\n\n" + 
     e.Exception.StackTrace; 

    new MessageDialog(message).ShowAsync(); 
} 

Когда исключение я получаю этот текст:

The operation identifier is not valid. 

The BackStack or ForwardStack cannot be changed while navigating. 

-2147020579 

The operation identifier is not valid. (Exception from HRESULT: 0x800710DD) 

код HRESULT действительно помогает мне ни:

C:\> err 0x800710DD 
# as an HRESULT: Severity: FAILURE (1), Facility: 0x7, Code 0x10dd 
# for hex 0x10dd/decimal 4317 : 
    ERROR_INVALID_OPERATION          winerror.h 
# The operation identifier is not valid. 
# 1 matches found for "0x800710DD" 

Update 2

Исключение возникает только при создании приложения в режиме деблокирования. Это не происходит в режиме отладки. И я должен перезагрузить устройство, чтобы произвести его.

+0

Я видел нечто подобное. В моем случае это было с тем, что карта Bing не была выпущена и была вызвана COMException. – Cheesebaron

+0

Не работает «BackStack или ForwardStack при навигации». дать вам достаточно указания? – Cheesebaron

+0

Нет, недостаточно! Можете ли вы дать мне подсказку? – Olaf

ответ

0

Я думаю, проблема в том, как вы это называете. Сначала вы вызываете ShowViewModel, а затем хотите удалить страницу из стека. И похоже, что в режиме выпуска он будет вызываться одновременно, поэтому вы получите это сообщение.

public class DropCurrentBackStackEntryHint : MvxPresentationHint 
{ 
    public Type ViewModelType; 

    public DropCurrentBackStackEntryHint(Type viewModelType) 
    { 
     ViewModelType = viewModelType; 
    } 
} 

И в вашем ВЕДУЩИЙ:

public override void ChangePresentation(MvxPresentationHint hint) 
{ 
    ... 

    if (hint is DropCurrentBackStackEntryHint) 
    { 
     var dropHint = (DropCurrentBackStackEntryHint) hint; 
     var nativeView = Mvx.Resolve<IMvxViewsContainer>().GetViewType(dropHint.ViewModelType); 

     RootFrame.Navigate(nativeView, null); 

     // Perhaps you need here a await Task.Delay(200); here. You have to test the value 

     if (RootFrame.BackStack.Any() && RootFrame.BackStack.Count > 1) 
     { 
      RootFrame.BackStack.RemoveAt(RootFrame.BackStackDepth - 2); 
     } 
    } 

    ... 
} 

Другим решением, не так приятно образом: Когда вы всегда хотите удалить последнюю страницу из стека, при переходе на эту страницу, вы можете удалите последнюю страницу из стопки в коде позади вашего представления.

public partial class XyzView 
{ 
... 
protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    base.OnNavigatedTo(e); 

    if(Frame.BackStack.Any() && Frame.BackStack.Count > 1) 
     Frame.BackStack.RemoveAt(Frame.BackStackDepth - 2); 
} 
... 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^