Windows Phone,实例化一个页面并显示它。

4

能否从另一个项目(在同一解决方案中,但这应该不重要,对吗?)实例化PhoneApplicationPage并显示它?

好的,我知道可以使用以下代码实例化另一个页面:

MyPageInProjectB bPage= new MyPageInProjectB ();

但是如何展示它呢?

我想要实现以下功能: 我有两个项目,我希望在一个项目中显示另一个项目的页面,并在它们之间传递数据。所以我认为这个方案非常完美:

public partial class MyPageInProjectA : PhoneApplicationPage
{
    private MyPageInProjectB bPage;

    public MyPageInProjectA()
    {
        InitializeComponent();

        MyComplexObject objectIWantToPassToOtherPage = new MyComplexObject ();

        bPage= new MyPageInProjectB (objectIWantToPassToOtherPage);
    }

    private void ShowBPageButton_Click(object sender, EventArgs e)
    {
        // this is now what I want to do, but what doesn't work
        bPage.Show();
    }
}

还有其他方法可以在这些页面之间传递复杂的数据吗?

我不想使用查询字符串,因为有时候(反)序列化程序会遇到MyComplexObject的问题。

我阅读了这个主题中关于如何在两个页面之间导航的文章:如何将指定项目中存在的页面重定向到同一解决方案中的其他项目中的另一个页面? 但是我想从一个页面传递一个复杂的对象到另一个页面。我该怎么做?


这两个项目都是Windows Phone应用程序项目吗? - Alaa Masoud
此时:不可以。 项目A是一个Windows手机应用程序,而另一个(ProjectB)则是一个类库。但如果这样更好,我可以进行更改。 - Rico-E
嗯,@Rico-E,你需要使用Navigate,就像Alaa的答案所指定的那样。.Show()不起作用。 - Paul Annetts
1
可能是重复的问题:如何在Windows Phone 8页面之间传递非字符串参数? - Paul Annetts
@PaulAnnetts 我知道 .Show() 不起作用,因为该方法不存在,它只应该澄清我想做什么。Navigate 的问题是,我不能将对象作为参数传递,对吧?我在想是否可以获取 bPage 对象背后的 XAML,并显示出来。这可行吗? - Rico-E
@PaulAnnetts 谢谢您指引我到另一个帖子。它很有帮助。 - Rico-E
1个回答

3

编辑:

现在,经过认真阅读您的问题,我可以给您一个更好的答案。

首先,您不能将数据传递给页面构造函数,因为当导航时运行时本身处理实例创建,并且您只能使用NavigationService进行导航。但是,您还有其他选择。

其中之一是使用查询字符串,但如果您不想使用它,您可以使用PhoneApplicationService来存储您的复杂对象,并让其他页面从中读取。

// In source page
MyComplexObject objectIWantToPassToOtherPage = new MyComplexObject ();
PhoneApplicationService.Current.State["MyComplexObject"] = objectIWantToPassToOtherPage;
NavigationService.Navigate(new Uri("/ProjectB;component/MyPageInProjectB.xaml", UriKind.Relative));

// In destination page's constructor
public MyPageInProjectB() {
  var myComplexObject = (MyComplexObject) PhoneApplicationService.Current.State["MyComplexObject"];
  // ...
}

除此之外,还可以使用全局变量。这是我能想到的唯一选项。


要导航到您类库中的页面 ProjectB,您需要使用类似以下的 uri:

/{assemblyName};component/{path}

在您的情况下,您可以执行以下操作:

NavigationService.Navigate(new Uri("/ProjectB;component/MyPageInProjectB.xaml", UriKind.Relative));

请注意,我在此处指定了相对路径,因此为了使上述示例正常工作,MyPageInProjectB.xaml 需要位于 ProjectB 内的根文件夹中。


1
抱歉,但这并不是真正的答案。我想在两个页面之间传递一个对象。导航本身不是问题。 - Rico-E
1
非常感谢您的时间!对我来说,这似乎是一个非常好的解决方案。抽象地说,它与https://dev59.com/GWYr5IYBdhLWcg3wdqCv中的方法非常相似。我会尝试一下。非常感谢! - Rico-E

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接