如何在同一解决方案中导航到另一个项目
嘿希望有人可以提供帮助。
我在小组中开发了许多不同的项目,我们现在想要将它们结合起来。 因此,我包括了这些项目。 在启动项目中,我包含对其他项目的引用。 然后我使用另一个stackoverflow线程中的代码:
如何导航到另一个项目的视图
这给了我以下几点
NavigationService.Navigate(new Uri("/MVVMTestApp;/component/View/MainPage.xaml", UriKind.Relative));
该项目建立并运行。 但是当我按下应该激活代码的按钮时,在执行该行之后/期间会出现错误。
中断错误位于MainPage.g.cs文件中,如下所示:
namespace MVVMTestApp { public partial class MainPage : Microsoft.Phone.Controls.PhoneApplicationPage { internal System.Windows.Controls.TextBlock MainPageTitle; internal System.Windows.Controls.TextBlock LEgE; private bool _contentLoaded; /// /// InitializeComponent /// [System.Diagnostics.DebuggerNonUserCodeAttribute()] public void InitializeComponent() { if (_contentLoaded) { return; } _contentLoaded = true; *******System.Windows.Application.LoadComponent(this, new System.Uri("/MVVMTestApp;component/View/MainPage.xaml", System.UriKind.Relative));** this.MainPageTitle = ((System.Windows.Controls.TextBlock)(this.FindName("MainPageTitle"))); this.LEgE = ((System.Windows.Controls.TextBlock)(this.FindName("LEgE"))); } } }
我插入星星的那条线就是它打破的地方。 我需要做些什么来使它工作?
额外
正如在评论中所说,我需要在组件之前包含一个前锋“/”,这是奇怪的,因为它没有在任何地方使用,否则像上面的链接和这个链接
http://www.geekchamp.com/tips/wp7-navigating-to-a-page-in-different-assembly
但是包括转发器我得到一个错误,那就是我没有指向任何xaml文件。 排除转发,我发现XamlParseException ….
所以我仍然有导航到另一个项目中的视图的问题。
奇
我现在不必在组件之前拥有领先的forwardslash。 只要我编写MVVMTestAppAssembly。 我查了汇编文件,找不到这个包括=?
看完msdn后我试了一下http://msdn.microsoft.com/en-us/library/cc296240%28v=vs.95%29.aspx
但仍然没有运气,导航工作
OVerview of reference并包含元素的完整路径
一种解决方案如一个答案中所述,一种解决方案是使用Windows phone类库。 但是当我使用MVVM结构时,我无法使viewmodelLocator工作。 因此,这对我来说不是解决方案。
但是如果你使用MVVM,我需要另一个解决方案。 希望有人对此有所了解。 另一种解决方案如下面的答案中所述,您可以使用以下解决方案1:
您使用相同类型的项目“Windows Phone App”。 在解决方案中,您需要有一个Windows Phone App项目,其他项目应该是Windows Phone Class Library类型。
然后,您可以使用以下代码行导航到在同一解决方案中的另一个项目中查看:
NavigationService.Navigate(new Uri("/MVVMTestApp;/component/View/MainPage.xaml", UriKind.Relative));
在项目之间导航。 但是,在生成的xaml文件FILENAME.g.cs中出现错误,它会插入行loadcomponent。 发生错误是因为视图通过datacontext连接到视图模型,据我所知。 我一直无法解决它。
有人有一个解决方案吗?
只需在“组件”之前删除“/”,如下所示:
NavigationService.Navigate(new Uri(“/ MVVMTestApp; component / View / MainPage.xaml”,UriKind.Relative));
首先,您必须参考父项目
你可以通过这条线解决这个问题
NavigationService.Navigate(new Uri("/MVVMTestApp;/View/MainPage.xaml", UriKind.Relative));
解决方案1:
您使用相同类型的项目“ Windows Phone App ”。 在解决方案中,您需要有一个Windows Phone App项目,其他项目应该是Windows Phone Class Library类型。
然后,您可以使用以下代码行导航到在同一解决方案中的另一个项目中查看:
NavigationService.Navigate(new Uri("/MVVMTestApp;/component/View/MainPage.xaml", UriKind.Relative));
解决方案2:
转到Debug中的Configuration Manager 。
取消选中MVVMTestApp中的Deploy复选框。
我认为问题出在你的设置上。 根据您的描述,您可以将项目命名为MVVMTestApp。 我认为这是启动项目。 但是,您的引用是从TestUserControls到MVVMTestApp。 这是倒退。 我知道根据你想要做的事情似乎是正确的,但事实并非如此(除非你的项目命名搞砸了。)
我建议你有两个项目:
- MVVMTestApp(Windows Phone 8.1 Universal App是启动项目)
- MVVMTestApp.Lib(支持Windows Phone 8.1的可移植类)
将MVVMTestApp中的引用添加到MVVMTestApp.Lib。
MVVMTestApp将具有MainPage.xaml和SecondPage.xaml。
我建议您的Lib只有共享用户控件而不能导航到的页面。 您可以将用户控件放在SecondPage上。
如果你想在共享库中使用SecondPage,那么处理起来会更难,但仍然可能。 但是,您将无法使用其他人建议的代码。 让共享代码调用MVVMTestApp是没有意义的,因为它实际上不是可共享的。 如果您有另一个与MVVMTestApp2共享的应用程序,该怎么办? 如果您对MVVMTestApp进行了硬编码,即使您可以使其与MVVMTestApp一起使用,也可能无法工作,因此将SecondPage放在单独的项目中没有任何好处。
要有一个可共享的页面回调应用程序,我认为你有两个选择。 您可以使用Inversion of Control并在Lib中定义INavigationService。 然后在您的MVVMTestApp中实现INavigateService并使用您喜欢的Ioc容器注册您的实现。 然后在您的Lib中,您可以在INavigationService上调用方法。 在MVVMTestApp实现中,您可以使用其他post中提供的代码导航到主页面。
另一个选择是在你的Lib中暴露一个事件。 您可以从MVVMTestApp中侦听事件,并在处理程序中导航到MainPage,就像在其他post中一样。 在您的Lib中,当您想要导航到MainPage时,您将提升事件。
祝你好运,玩得开心,
汤姆