Metro App中搜索和共享数据的使用
本文主要介绍基于XAML+C#实现Search Contract和Share Contract功能。通常我们在Windows 8中进行搜索(使用快捷键windows图标+Q),下面我们就一一介绍实现的步骤。
1.首先我们介绍搜索功能的实现
1)搜索合约声明:
我们打开上面提到的示例程序,并打开Package.appxmanifest文件,选择声明选项卡,如下图(红色矩形中的选择),并找到选择搜索声明,然后添加:
然后我们部署应用程序到计算机上。部署完毕之后,按Windows+Q组合键,可以看到,我们的示例程序已经在搜索面板中了。如果这里不添加搜索声明的话,在搜索面板中是看不到的。
2)搜索的激活
打开App.xml.cs文件,在其中添加如下方法:
protected async override void OnSearchActivated(SearchActivatedEventArgs args)
{
string data = args.QueryText;
// 添加自己的方法,将输入的关键字传到应用里面去,进行搜索
if (args.PreviousExecutionState == ApplicationExecutionState.NotRunning)
{
await PageStart(args,data); //App.xml.cs中定义的私有方法,下面有介绍
return;
}
PageUpdate(data); ////App.xml.cs中定义的私有方法,下面有介绍
}
注意:原来的方法中是没有红色标记的部分,这里是因为要使用异步(await),所以需要添加.
当应用程序以显示搜索结果为目的被激活时,该方法会被调用,也就是说,从搜索面板中输入内容,然后回车可以激活该方法。
2.共享功能的实现
1)共享合约声明:
我们打开上面提到的示例程序,并打开Package.appxmanifest文件,选择声明选项卡,如下图(红色矩形中的选择),并找到选择共享声明,然后添加:
注意上面的红色叉叉,那是因为我们没有设置共享数据的类型而引起的错误,在这里我的应用程序需要使用的是Text类型的,因此我选择Text类型,如下图所示:
下面我们就可以打开共享面板,进行共享操作,但是在这之前,还需要实现共享的激活。
2)共享的激活
打开App.xml.cs文件,在其中添加如下方法:
protected async override void OnShareTargetActivated(ShareTargetActivatedEventArgs args)
{
string data = await args.ShareOperation.Data.GetTextAsync();
if (args.PreviousExecutionState == ApplicationExecutionState.NotRunning)
{
await PageStart(args,data); //自定义的方法,实现应用程序在不同状态下的操作
return;
}
PageUpdate(data); ////自定义的方法,实现应用程序在不同状态下的操作
}
注:App.xaml.cs中用到的自定义方法
/// <summary>
/// 程序启动时初始化页面
/// </summary>
/// <param name="args"></param>
/// <returns></returns>
private async Task PageStart(IActivatedEventArgs args,string data)
{
Frame rootFrame = Window.Current.Content as Frame;
if (rootFrame == null)
{
rootFrame = new Frame();
if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)
{
//TODO: 从之前挂起的应用程序加载状态
}
}
if (Window.Current.Content == null)
{
rootFrame = new Frame();
rootFrame.Navigate(typeof(MainPage));
Window.Current.Content = rootFrame;
}
Window.Current.Activate();
}
private void PageUpdate(string data)
{
Frame rootFrame = Window.Current.Content as Frame;
if (rootFrame == null)
{
rootFrame = new Frame();
}
if (rootFrame.Content == null)
{
if (!rootFrame.Navigate(typeof(MainPage), data))
{
throw new Exception("Failed to create initial page");
}
}
else
{
MainPage page = rootFrame.Content as MainPage;
if (page == null)
{
page = new MainPage();
rootFrame.Content = page;
}
page.SearchKey(data); //该方法是我词典页面中公开的方法,作用时查询传入的单词,然后显示出来。公开该方法主要是实现共享时,对单词的查询
}
Window.Current.Content = rootFrame;
Window.Current.Activate();
}
}
以上就实现了搜索和共享功能,程序中的自定义方法,根据不同的程序自己进行修改。
另外可以参考:
http://www.devdiv.com/Windows_8_Metro_App开发_12_Windows_8_中搜索合约的使用-thread-131730-1-1.html
http://www.silverlightchina.net/html/windows8/study/2012/0621/16882.html
http://www.silverlightchina.net/html/windows8/study/2012/0621/16880.html