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

 

posted @ 2012-11-20 19:29  @大龙哥  阅读(1423)  评论(0编辑  收藏  举报