Silverlight: Макет меняется, когда я вызываю NavigationService.Navigate

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

У меня есть два ListBox , которые действуют как меню.

                <ListBox Margin="56,8,15,0" FontSize="64"
                         ItemsSource="{Binding FavoriteSections}"
                         SelectionChanged="MenuList_SelectionChanged">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel>
                                <toolkit:ContextMenuService.ContextMenu>
                                    <toolkit:ContextMenu>
                                        <toolkit:MenuItem Header="Remove" Click="FavoritesContextMenuItem_Click" />
                                    </toolkit:ContextMenu>
                                </toolkit:ContextMenuService.ContextMenu>

                                <TextBlock Text="{Binding DisplayName}" />
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>


                <ListBox x:Name="sectionList" Margin="56,8,15,0" FontSize="64" 
                         SelectionChanged="MenuList_SelectionChanged"
                         ItemsSource="{Binding SectionViewModels}">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel>
                                <toolkit:ContextMenuService.ContextMenu>
                                    <toolkit:ContextMenu>
                                        <toolkit:MenuItem Header="Add to favorites" Click="SectionContextMenuItem_Click" />
                                    </toolkit:ContextMenu>
                                </toolkit:ContextMenuService.ContextMenu>
                                <TextBlock Text="{Binding DisplayName}" />
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>

Ошибка существует повсюду. оба из них.

Когда выбор изменяется в любом меню, вызывается этот метод:

    void MenuList_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (e.AddedItems.Count == 0)
        {
            return;
        }

        Uri page = null;
        object selected = e.AddedItems[0];
        if (selected is NavigableItem)
        {
            NavigableItem selectedItem = (NavigableItem)selected;
            page = selectedItem.Page;
        }
        else if (selected is SectionViewModel)
        {
            SectionViewModel selectedVM = (SectionViewModel)selected;
            page = selectedVM.Section.Page;
        }

        Debug.Assert(page != null, "What is the type of `selected`?");

        // if I comment out this line, the problem goes away:
        NavigationService.Navigate(page);

        ListBox selectedBox = (ListBox)sender;
        selectedBox.SelectedIndex = -1;
    }

Если я закомментирую строку NavigationService.Navigate () , проблема исчезнет. Если я заменю строку другим URI, проблема останется.

Примерно в 70% случаев, когда я нажимаю на элемент меню, содержимое перескакивает по всей странице. (Остальные 30%, ошибок не возникает.) Это происходит слишком быстро, чтобы увидеть, что на самом деле происходит, но разные элементы пользовательского интерфейса накладываются друг на друга.

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

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

Я использую Silverlight для Windows Phone 7

Обновление : таинственным образом , Я не могу воспроизвести это в отладчике - только после развертывания приложения и его запуска в эмуляторе без подключения. ???

Обновление 2 : ошибка появляется, когда NavigationService.Navigate () также вызывается из обработчика события Click кнопки:

<Button Content="Foo" Click="Button_Click" Grid.Row="0"/>

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            NavigationService.Navigate(new Uri("/Views/sections.xaml?section=43", UriKind.Relative));
        }

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

Обновление 3 : Еще больше странностей. По-прежнему не удается воспроизвести приложение, пока подключен отладчик. Если я сделаю так, чтобы индикатор выполнения загрузки всегда был свернут, ошибка исчезнет:

                <ProgressBar x:Name="LoadingProgressBar"
                 IsIndeterminate="True"
                 Visibility="Collapsed"
                 Style="{StaticResource PerformanceProgressBar}"
                 VerticalAlignment="Top"/>

В качестве альтернативы, закомментировав эту строку в коде программной части, ошибка исчезнет:

LoadingProgressBar.Visibility = Visibility.Collapsed;

Я действительно не понимаю, что здесь происходит. Эта строка кода не выполняется при переходе по странице.

Вот полный код XAML элемента управления, в котором происходит сбой:

                    <ProgressBar x:Name="LoadingProgressBar"
                     IsIndeterminate="True"
                     Visibility="Collapsed"
                     Style="{StaticResource PerformanceProgressBar}"
                     VerticalAlignment="Top"/>

                <TextBlock x:Name="DownloadFailed"
                         Visibility="Collapsed"
                         Style="{StaticResource disabledText}"
                         Margin="56,8,8,-8" >
                    FooBar.com could not be reached. Do you have a network connection?
                </TextBlock>

                <ListBox x:Name="sectionList" Margin="56,8,15,0" FontSize="64" 
                         SelectionChanged="MenuList_SelectionChanged"
                         ItemsSource="{Binding SectionViewModels}">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel>
                                <toolkit:ContextMenuService.ContextMenu>
                                    <toolkit:ContextMenu>
                                        <toolkit:MenuItem Header="Add to favorites" Click="SectionContextMenuItem_Click" />
                                    </toolkit:ContextMenu>
                                </toolkit:ContextMenuService.ContextMenu>
                                <TextBlock Text="{Binding DisplayName}" />
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>

            </Grid>
        </controls:PivotItem>
6
задан Nick Heiner 2 January 2011 в 07:58
поделиться