c# – Prism NavigationService获取以前的视图名称
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – Prism NavigationService获取以前的视图名称,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3487字,纯文字阅读大概需要5分钟。
内容图文
![c# – Prism NavigationService获取以前的视图名称](/upload/InfoBanner/zyjiaocheng/761/e907440836b442f79a1637efb474ee55.jpg)
目前我正在实施一个屏幕,指示模块不存在或仍在开发中.
后退按钮具有以下代码:
regionNavigationService.Journal.GoBack();
这是按预期工作的.但是用户不是来自主屏幕.所以我需要从导航日志中的最后一个条目访问视图名称.
示例:用户来自“设置”屏幕=>文本应显示“返回设置屏幕”
解决方法:
假设您正在寻找的视图名称是当您执行新的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中使用unity,则需要替换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
内容总结
以上是互联网集市为您收集整理的c# – Prism NavigationService获取以前的视图名称全部内容,希望文章能够帮你解决c# – Prism NavigationService获取以前的视图名称所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。