每次HyperlinkBut​​ton点击(Silverlight)都会增加NavigationPage

时间:2011-06-30 19:34:31

标签: silverlight mvvm navigation mvvm-light

这可能是其中一个问题,答案真的应该太明显,不容错过。不过,我似乎无法弄清楚为什么我的“游戏和学习”应用程序的行为方式。

在我的Mainpage.xaml上,我有一个StackPanel,其中包含多个HyperlinkButtons,导航到一组NavigationPages。还有NavigationFrameUriMapper来保存“页面”。

<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光消息来通知子窗口应该打开时,...我得到两个子窗口(或者每次我从超链接按钮进入商店导航页面时都有一个窗口)。

我假设在点击超链接按钮的同时,你只有一个NavigationPage ..或者至少在离开导航页时当前被破坏了。

我错过了哪些明显的东西?

1 个答案:

答案 0 :(得分:2)

问题很可能在于注册消息处理程序。 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方法。