【问题标题】:NavigationPage is incremented for each HyperlinkButton click (Silverlight)NavigationPage 每单击一次 HyperlinkBut​​ton 就会递增(Silverlight)
【发布时间】:2011-06-30 19:34:30
【问题描述】:

这可能是其中一个问题的答案真的应该太明显以至于任何人都不能错过。不过,我似乎无法弄清楚为什么我的“play&learn”应用程序的行为方式如此。

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

我推测当点击超链接按钮时,您将只有一个 NavigationPage ..或者至少当前在离开导航页时被破坏了。

我遗漏了什么明显的东西?

【问题讨论】:

  • 您是如何处理这些消息的?一个窗口(重用)可能会重复添加一个处理程序。你能提供商店页面的代码吗?为避免这种情况,请始终在将处理程序添加到代码中之前删除处理程序(以防代码运行两次)。

标签: silverlight mvvm navigation mvvm-light


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 2015-09-24
    相关资源
    最近更新 更多