假设您要查找的视图名称是当您执行 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