从UserControl导航并传递复杂对象

时间:2013-07-12 09:48:33

标签: c# .net xaml navigation windows-phone-8

我很难理解WP8上的导航是如何工作的,我正面临这个问题:

让我们假设我在一个单独的项目中有一个自定义控件,并且我在同一个项目中有一个控件设置页面。

所以这是结构:

CustomControlProject
                    |- CustomControl.xaml
                    |- CustomControlSettings.xaml

CustomControl扩展UserControl

现在,我想要做的是将一些数据传递给CustomControlSettings.xaml,而我正在谈论一个复杂的对象(StackPanel)。

由于CustomControlUserControl,我没有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,如何将对象传递给页面并导航到该页面?

1 个答案:

答案 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"];
  // ...
}