我很难理解WP8上的导航是如何工作的,我正面临这个问题:
让我们假设我在一个单独的项目中有一个自定义控件,并且我在同一个项目中有一个控件设置页面。
所以这是结构:
CustomControlProject
|- CustomControl.xaml
|- CustomControlSettings.xaml
CustomControl扩展UserControl
。
现在,我想要做的是将一些数据传递给CustomControlSettings.xaml
,而我正在谈论一个复杂的对象(StackPanel
)。
由于CustomControl
是UserControl
,我没有NavigationService
因此我正在使用此代码(我在stackoverflow上找到它但我丢失了标签):
/// <summary>
/// Walk visual tree to find the first DependencyObject of the specific type.
/// </summary>
private DependencyObject GetDependencyObjectFromVisualTree(DependencyObject startObject, Type type)
{
//Walk the visual tree to get the parent(ItemsControl)
//of this control
DependencyObject parent = startObject;
while (parent != null)
{
if (type.IsInstanceOfType(parent))
break;
else
parent = VisualTreeHelper.GetParent(parent);
}
return parent;
}
这样我才能做到
Page pg = GetDependencyObjectFromVisualTree(this, typeof(Page)) as Page;
pg.NavigationService ...
传递一个复杂的对象需要其他东西,所以我按照这里的说明进行操作:http://www.sharpregion.com/easy-windows-phone-7-navigation/
这最终会产生类似这样的导航方法:
base.OnTap(e);
Page pg = GetDependencyObjectFromVisualTree(this, typeof(Page)) as Page;
NavigationExt.Navigator.Navigate<DestinationPage>(pg.NavigationService, objectToPass);
我会在另一个项目中使用此控件作为MainPage.xaml
的孩子。
这应该意味着Page pg = GetDependencyObjectFromVisualTree(this, typeof(Page)) as Page;
会将MainPage
作为pg
,这会导致异常,因为与{{1}在同一文件夹中没有DestinationPage.xaml
}。
MainPage.xaml
所以问题是:
如果我在项目B中有自定义控件和页面,如果从项目A引用项目B,如何将对象传递给页面并导航到该页面?
答案 0 :(得分:1)
查看您的问题和代码,我了解您希望在用户控件中点击某个元素时导航到某个页面。页面和用户控件都位于与主项目不同的项目中。
由于您的用户控件将托管在主项目的某个页面中,因此导航时的URI应如下所示:
/{assemblyName};component/{relativePath}
现在,NavigationService
内无法使用UserControl
,但您可以使用Application.RootVisual
base.OnTap(e);
var frame = Application.Current.RootVisual as PhoneApplicationFrame;
frame.Navigate(new Uri("/CustomControlProject;component/CustomControlSettings.xaml",
UriKind.Relative));
为了将对象传递给页面,有很多方法。其中一个是利用PhoneApplicationService
。
你可以这样做:
base.OnTap(e);
MyObjectType objectToPass = new MyObjectType();
PhoneApplicationService.Current.State["myObject"] = objectToPass;
var frame = Application.Current.RootVisual as PhoneApplicationFrame;
frame .Navigate(new Uri("/CustomControlProject;component/CustomControlSettings.xaml",
UriKind.Relative));
// In destination page's constructor
public CustomControlSettings() {
var myObject = (MyObjectType) PhoneApplicationService.Current.State["myObject"];
// ...
}