【问题标题】:Prism NavigationService get previous view namePrism NavigationService 获取上一个视图名称
【发布时间】:2014-10-02 01:15:34
【问题描述】:

目前我正在实现一个屏幕,指示模块不存在或仍在开发中。

后退按钮的代码如下:

 regionNavigationService.Journal.GoBack();

这按预期工作。但是用户不是来自Home 屏幕。 所以我需要从导航日志中的最后一个条目访问视图名称。

示例:用户来自设置屏幕 => 文本应显示“返回设置屏幕”

【问题讨论】:

  • 我相信你可以有一个Stack,向前导航时推送视图名称,向后导航时弹出它。在这个阶段,堆栈中的顶部元素就是您所需要的。不确定任何已经存在的东西。我不熟悉NavigationService,所以如果我说一些愚蠢的话,请放轻松。

标签: c# wpf navigation prism


【解决方案1】:

假设您要查找的视图名称是当您执行 new Uri("Main", UriKind.Relative) 时,您希望单词 Main 作为视图名称。

RegionNavigationJournal 中的前向和后向堆栈是私有的。您可以使用反射来访问它。

var journal = regionNavigationService.Journal as RegionNavigationJournal;
if (journal != null)
{
    var stack =
        (Stack<IRegionNavigationJournalEntry>)
        typeof (RegionNavigationJournal).GetField("backStack",
                                                  BindingFlags.NonPublic | BindingFlags.Instance)
                                        .GetValue(journal);

    var name = stack.Peek().Uri.OriginalString;
}

或者更好的方法是实现你自己的 IRegionNavigationJournal ,它是它的一个包装器。这是使用 Unity 构造函数注入默认的 RegionNavigationJournal 如果使用 MEF,您可能需要将 ImportingConstructorAttribute 放在其上。

public class RegionNavigationJournalWrapper : IRegionNavigationJournal
{

    private readonly IRegionNavigationJournal _regionNavigationJournal;
    private readonly Stack<Uri> _backStack = new Stack<Uri>();

    // Constructor inject prism default RegionNavigationJournal to wrap
    public RegionNavigationJournalWrapper(RegionNavigationJournal regionNavigationJournal)
    {
        _regionNavigationJournal = regionNavigationJournal;
    }

    public string PreviousViewName
    {
        get
        {
            if (_backStack.Count > 0)
            {
                return _backStack.Peek().OriginalString;
            }
            return String.Empty;
        }
    }

    public bool CanGoBack
    {
        get { return _regionNavigationJournal.CanGoBack; }
    }

    public bool CanGoForward
    {
        get { return _regionNavigationJournal.CanGoForward; }
    }

    public void Clear()
    {
        _backStack.Clear();
        _regionNavigationJournal.Clear();
    }

    public IRegionNavigationJournalEntry CurrentEntry
    {
        get { return _regionNavigationJournal.CurrentEntry; }
    }

    public void GoBack()
    {
        // Save current entry
        var currentEntry = CurrentEntry;
        // try and go back
        _regionNavigationJournal.GoBack();
        // if currententry isn't equal to previous entry then we moved back
        if (CurrentEntry != currentEntry)
        {
            _backStack.Pop();
        }
    }

    public void GoForward()
    {
        // Save current entry
        var currentEntry = CurrentEntry;
        // try and go forward
        _regionNavigationJournal.GoForward();
        // if currententry isn't equal to previous entry then we moved forward
        if (currentEntry != null && CurrentEntry != currentEntry)
        {
            _backStack.Push(currentEntry.Uri);
        }
    }

    public INavigateAsync NavigationTarget
    {
        get { return _regionNavigationJournal.NavigationTarget; }
        set { _regionNavigationJournal.NavigationTarget = value; }
    }

    public void RecordNavigation(IRegionNavigationJournalEntry entry)
    {
        var currentEntry = CurrentEntry;
        _regionNavigationJournal.RecordNavigation(entry);
        // if currententry isn't equal to previous entry then we moved forward
        if (currentEntry != null && CurrentEntry == entry)
        {
            _backStack.Push(currentEntry.Uri);
        }
    }
}

如果在您的 Prism Bootstrapper 中使用统一,您将需要替换 IRegionNavigationJournal 的默认注册

protected override void ConfigureContainer()
{
    this.RegisterTypeIfMissing(typeof(IRegionNavigationJournal), typeof(RegionNavigationJournalWrapper), false);

    base.ConfigureContainer();
}

如果使用 MEF,您需要将 ExportAttribute 放在 RegionNavigationJournalWrapper 之上

[Export(typeof(IRegionNavigationJournal))]

您可以查看http://msdn.microsoft.com/en-us/library/gg430866%28v=pandp.40%29.aspx,了解有关用您自己的替换默认实现的更多信息。拥有包装器后,您仍然需要将其转换为 RegionNavigationJournalWrapper 以访问 PreviousViewName,因此仍然不完美,或者创建一个 RegionNavigationJournalWrapper 也实现的接口以转换为该接口以让您访问 PreviousViewName

【讨论】:

  • 非常好的答案,为此点赞!我明天检查并确认。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
  • 1970-01-01
  • 2014-03-05
相关资源
最近更新 更多