NavigationPage увеличивается для каждого щелчка по гиперссылке (Silverlight) - PullRequest
1 голос
/ 30 июня 2011

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

На моем Mainpage.xaml у меня есть StackPanel, содержащий несколько HyperlinkButtons, который перемещается к набору NavigationPages.Существует также NavigationFrame с UriMapper для хранения "страниц".

<StackPanel Background="Black" Orientation="Horizontal" Grid.Row="0">
    <HyperlinkButton Name="Home" 
                     TargetName="MainPageFrame" NavigateUri="/Home"
                     Foreground="White" FontWeight="Bold" Content="Home" />
    <HyperlinkButton Name="Users" 
                     TargetName="MainPageFrame" NavigateUri="/Users"
                     Foreground="White" FontWeight="Bold" Content="Users" />
    <HyperlinkButton Name="Store" Foreground="White" FontWeight="Bold" Content="Store"
                     TargetName="MainPageFrame" NavigateUri="/Stores"/>          
</StackPanel>
<navigation:Frame x:Name="MainPageFrame" Grid.Row="1" Source="/Home" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" JournalOwnership="Automatic">
    <navigation:Frame.UriMapper>
        <uriMapper:UriMapper>
            <uriMapper:UriMapping Uri="/{pageName}" MappedUri="/Views/{pageName}.xaml"/>
        </uriMapper:UriMapper>
    </navigation:Frame.UriMapper>
</navigation:Frame>

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

Поскольку я использую легкие сообщения MVVM, чтобы уведомить, что дочернее окно должно открыться, ... Iполучить два дочерних окна (или по одному на каждый раз, когда я заходил на страницу навигации по магазинам с помощью кнопок гиперссылок).

Я предполагал, что при нажатии на кнопки гиперссылок у вас будет только одна NavigationPage .. или как минимумток был разрушен при выходе из навигационной страницы.

Что за очевидная вещь мне не хватает?

1 Ответ

2 голосов
/ 01 июля 2011

Скорее всего, проблема заключается в регистрации обработчика сообщений.Существует известная проблема с MVVM Light Messenger, которая приводит к тому, что объект, обрабатывающий сообщение, не освобождается должным образом.

Решение довольно простое - при условии, что ваше представление обрабатывает сообщение - ваш код должен выглядеть примернонапример:

public StoreView() {
    Messenger.Default.Register<NotificationMessage>(this, (m) => {
        // some message handling
    });

    InitializeComponent();
}

Теперь измените его так, чтобы он выглядел примерно так:

public StoreView() {
    Messenger.Default.Register<NotificationMessage>(this, (m) => {
        // some message handling
    });

    InitializeComponent();

    this.Unloaded += (sender, args) => {
        Messenger.Default.Unregister(this);
    };
}

Код в событии unloaded гарантирует, что обработчик сообщений должным образом не зарегистрирован.Для сообщений в ViewModels убедитесь, что вызывается метод Cleanup.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...