Аргумент недопустимое исключение при навигации - PullRequest
1 голос
/ 20 февраля 2011

У меня странная проблема, когда я возвращаюсь на страницу, впервые просмотренную в приложении Windows Phone 7, я получаю исключение

"{System.ArgumentException: параметр указан неверно.}"

Не могу найти источник ошибки - кто-нибудь еще испытывал это?

Callstack - это:

   at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)
   at System.ThrowHelper.ThrowArgumentOutOfRangeException()
   at System.Collections.Generic.List`1.get_Item(Int32 index)
   at System.Collections.Generic.List`1.System.Collections.IList.get_Item(Int32 index)
   at System.Windows.Controls.ItemCollection.GetItemImpl(Int32 index)
   at System.Windows.Controls.ItemCollection.GetItemImplSkipMethodPack(Int32 index)
   at System.Windows.PresentationFrameworkCollection`1.get_Item(Int32 index)
   at System.Windows.Controls.VirtualizingStackPanel.CleanupContainers(ItemsControl itemsControl)
   at System.Windows.Controls.VirtualizingStackPanel.MeasureOverride(Size constraint)
   at System.Windows.FrameworkElement.MeasureOverride(IntPtr nativeTarget, Single inWidth, Single inHeight, Single& outWidth, Single& outHeight)
   at MS.Internal.XcpImports.MeasureOverrideNative(IntPtr element, Single inWidth, Single inHeight, Single& outWidth, Single& outHeight)
   at MS.Internal.XcpImports.FrameworkElement_MeasureOverride(FrameworkElement element, Size availableSize)
   at System.Windows.FrameworkElement.MeasureOverride(Size availableSize)
   at System.Windows.Controls.ScrollContentPresenter.MeasureOverride(Size constraint)
   at System.Windows.FrameworkElement.MeasureOverride(IntPtr nativeTarget, Single inWidth, Single inHeight, Single& outWidth, Single& outHeight)
   at MS.Internal.XcpImports.MeasureNative(IntPtr element, Single inWidth, Single inHeight)
   at MS.Internal.XcpImports.UIElement_Measure(UIElement element, Size availableSize)
   at System.Windows.UIElement.Measure(Size availableSize)
   at System.Windows.Controls.ScrollViewer.MeasureOverride(Size constraint)
   at System.Windows.FrameworkElement.MeasureOverride(IntPtr nativeTarget, Single inWidth, Single inHeight, Single& outWidth, Single& outHeight)
   at MS.Internal.XcpImports.MeasureOverrideNative(IntPtr element, Single inWidth, Single inHeight, Single& outWidth, Single& outHeight)
   at MS.Internal.XcpImports.FrameworkElement_MeasureOverride(FrameworkElement element, Size availableSize)
   at System.Windows.FrameworkElement.MeasureOverride(Size availableSize)
   at System.Windows.FrameworkElement.MeasureOverride(IntPtr nativeTarget, Single inWidth, Single inHeight, Single& outWidth, Single& outHeight)
   at MS.Internal.XcpImports.MeasureOverrideNative(IntPtr element, Single inWidth, Single inHeight, Single& outWidth, Single& outHeight)
   at MS.Internal.XcpImports.FrameworkElement_MeasureOverride(FrameworkElement element, Size availableSize)
   at System.Windows.FrameworkElement.MeasureOverride(Size availableSize)
   at System.Windows.FrameworkElement.MeasureOverride(IntPtr nativeTarget, Single inWidth, Single inHeight, Single& outWidth, Single& outHeight)
   at MS.Internal.XcpImports.MeasureOverrideNative(IntPtr element, Single inWidth, Single inHeight, Single& outWidth, Single& outHeight)
   at MS.Internal.XcpImports.FrameworkElement_MeasureOverride(FrameworkElement element, Size availableSize)
   at System.Windows.FrameworkElement.MeasureOverride(Size availableSize)
   at Microsoft.Phone.Controls.PhoneApplicationFrame.MeasureOverride(Size availableSize)
   at System.Windows.FrameworkElement.MeasureOverride(IntPtr nativeTarget, Single inWidth, Single inHeight, Single& outWidth, Single& outHeight)

Интересно, что у кого-то еще такая же ошибка:

.NET: ArgumentOutOfRangeException при вызове .Добавить в коллекцию (Проблема с управлением сводкой)

но моя ошибка не связана с наблюдаемым списком, так как мой список не , унаследованный от наблюдаемых типов списков ...

XAML для страницы, к которой осуществляется переход, также очень прост:

<phone:PhoneApplicationPage 
    x:Class="TestApp.PhoneApplication.AddItem"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"
    shell:SystemTray.IsVisible="True">

    <!--LayoutRoot is the root grid where all page content is placed-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <!--TitlePanel contains the name of the application and page title-->
        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
            <TextBlock x:Name="ApplicationTitle" Text="TestApplication" Style="{StaticResource PhoneTextNormalStyle}"/>
        </StackPanel>

        <!--ContentPanel - place additional content here-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <TextBox Height="72" HorizontalAlignment="Left" Margin="0,324,0,0" Name="txtItemName" Text="Item name" VerticalAlignment="Top" Width="450" GotFocus="txtItemName_GotFocus" LostFocus="txtItemName_LostFocus" />
            <Button Content="Save" Height="72" HorizontalAlignment="Left" Margin="0,402,0,0" Name="btnSave" VerticalAlignment="Top" Width="160" Click="btnSave_Click" />
            <Button Content="Cancel" Height="72" HorizontalAlignment="Left" Margin="290,402,0,0" Name="btnCancel" VerticalAlignment="Top" Width="160" Click="btnCancel_Click" />
        </Grid>
        <ProgressBar Height="4" Style="{StaticResource PerformanceProgressBar}"  HorizontalAlignment="Left" Margin="12,480,0,0" Name="progressBar1" VerticalAlignment="Top" Width="460" Grid.Row="1" Opacity="0" Background="#FFCF2B26" Foreground="#FFCF2B26" />
    </Grid>
</phone:PhoneApplicationPage>

Ответы [ 4 ]

2 голосов
/ 22 февраля 2011

Я нашел решение для этого.

пользовательская навигация была:

  • загрузить приложение и перейти в main.xaml (если в onnavigating нет элементов, переходящих в additem.xaml)
  • введите пункт
  • перейти на main.xaml
  • перейти к подробному виду и удалить элемент
  • вернитесь обратно в main.xaml, где, если нет предметов, я возвращаюсь СНОВА

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

Похоже, что это происходило в 2 NavigationContext.GoBack (), потому что он запускался в другом потоке и появлялся только ПОСЛЕ того, как навигация начала происходить - странно.

Я решил эту проблему, сделав коллекцию, отображаемую в виде списка в main.xaml, видимой и сделав элементы внутри привязанными к INotifyChanged. Как только я это сделал, все волшебным образом начало работать ...

спасибо всем, кто пытался помочь - ваш вклад был очень признателен (мои благодарности показывают эту благодарность)

1 голос
/ 20 февраля 2011

Это может произойти, если вы переходите на ту же страницу, где находитесь.(Если RootFrame.OriginalSource имеет значение «Sample.xaml», и вы выполняете навигацию («Samle.xaml», UriKind.Relative))

1 голос
/ 21 февраля 2011

Хорошо, исходя из стека, похоже, что вы заставляете VirtualizingStackPanel получить доступ к списку за пределами.Возможно, это ошибка в фреймворке, но, скорее всего, вы делаете то, чего не ожидаете.Вы вручную (программно) добавляете и удаляете вещи на панель?Вы делаете что-то, когда обнаруживаете прокрутку?Посмотрите, как вы манипулируете StackPanel на этой странице.

Кроме того, они, люди, предполагающие, что вы используете двойную навигацию, кажутся неправильными на основании этой новой информации, а также содержимого сообщения об исключении.Первоначально я думал, что это проблема, когда я увидел ваш заголовок, поэтому я понимаю, откуда они берутся, но в данном случае исключением является что-то вроде «Фрагменты не поддерживаются».Что явно не так.

1 голос
/ 20 февраля 2011

У вас есть какой-нибудь код, который приведет к такой ситуации, как:

protected override void  OnNavigatedTo(NavigationEventArgs e)
    {
        if(//some condition where page should go back )
        {
            if(NavigationService.CanGoBack)
                NavigationService.GoBack();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...