2017-05-26 75 views
1

我有一个UWP项目有2页到目前为止。 MainPage.xaml是应用程序的基本布局(汉堡菜单,搜索栏等)。该MainPage的另一部分包含一个框架,其中加载了其他页面LandingPage.xaml。我想从MainPage.xaml中的AutosuggestBox捕获用户输入,并在LandingPage.xaml(它位于MainPage.xaml中存在的框架中)上显示结果。如何处理发生在不同页面上的事件

我试着继承MainPage,但这是不允许的。

+0

您使用MVVM吗? –

回答

3

虽然玛丽安的回答肯定会的工作,我认为这远远不是“干净”或“好'代码。

首先,您应该在您的UWP应用程序中实现MVVM模式(如果您没有这样做),并为此使用依赖注入框架。一个非常基础的,容易理解的是MVVMLight,而更复杂的选择框架可以是Autofac。我建议你从前者开始,将头围绕在头上更快。

在MVVM中,有一个概念可以解决您的问题:信使。我不想在这里详细讨论,因为已经有很多非常好的资源,比我更聪明的人写的。例如本文来自MVVMLight自己的作者:https://msdn.microsoft.com/en-us/magazine/jj694937.aspx(我知道它是从2013年开始讲的关于Windows 8的,但不用担心,概念是一样的。)

这个想法是,不同的ViewModels不应该有严格相互依赖 - 它使得单元测试(这是首先完成MVVM的一个要点)很难。所以在你的情况下,你应该有两个ViewModel:MainViewModel和LandingViewModel。一个用于MainPage,另一个用于LandingPage。现在,您应该在MainPage的代码隐藏中为AutoSuggestBox的QuerySubmitted事件实现一个处理程序,并在MainViewModel中调用一个函数。在这个函数中,你将用来自你的AutoSuggestBox的字符串实例化一个新的消息(你可以从数据绑定到它或者通过QuerySubmitted的事件处理程序获取,这取决于你),并通过Messenger发送它。在LandingViewModel中,您可以订阅此确切消息,然后再次通过LandingPage上的数据绑定显示收到的消息,这只是少数几行的问题。

我知道它看起来像是一个很基本的事情很麻烦,特别是如果你比较它与玛丽安的直接点解决方案。但请相信我,从长远来看,编写干净的代码,很好地分离,很容易进行单元测试的ViewModel将弥补您最初必须付出的额外努力,才能使其工作。在两个ViewModel之间建立了这样一个系统之后,添加第三个(我认为您需要尽快完成)是非常简单的,并且可以很快完成。

2

如果您没有使用MVVM,我会建议在AutoSuggestBox上添加x:FieldModifier="public",然后向MainPage添加一个公共静态属性来存储它的实例。

MainPage.xaml.cs中

public static MainPage Current { get; private set; } 

public MainPage() 
{ 
    Current = this; 
    // Rest of your code in ctor 
} 

然后,您可以使用访问

string text = MainPage.Current.NameOfYourAutoSuggestBox.Text; 
相关问题