Windows 8 Search Contract

Mit den Windows 8 Contracts, können Anwendungen oder das Betriebssystem mit einer App kommunizieren, auch wenn diese nicht läuft. So kann der Benutzer über dem Charme Suchdialog in verschiedenen APPs suchen.

image

Wie üblich muss zunächst im Manifest die Declaration search aktiviert werden. Dann wird eine neue Seite mit dem Template “Search Contract” erstellt.

image\

Dies erzeugt die Page die gestartet wird, wenn die APP per Search aktiviert wird. Gesteuert wird dies in der app.xaml.vb.  mit dem Event OnSearchActivated. Der folgende Codeblock wird automatisch vom “Search Contract” Template mit erzeugt.

Protected Overrides Sub OnSearchActivated(ByVal e As Windows.ApplicationModel.Activation.SearchActivatedEventArgs)
        SearchResultsPage1.Activate(e.QueryText)
        'TODO: Move the following code to OnLaunched to speed up searches when your
        'application is already running:
        AddHandler Windows.ApplicationModel.Search.SearchPane.GetForCurrentView().QuerySubmitted,
            Sub(sender, queryArgs)
                SearchResultsPage1.Activate(queryArgs.QueryText)
            End Sub
End Sub

In meinem Beispiel baue ich allerdings eine davon unabhängige Suche in die APP ein. Da eine APP durchaus mehrere Listen darstellen kann, sollte in diesen auch gesucht werden können.

Hier wird vom ppedv Twitter Account die Neuigkeiten geladen. Dazu kommt der SyndicationClient zum Einsatz. Alles in WinRT und .NET vorhanden und mit einem Vierzeiler an VB Code zu erledigen.

Private Async Sub UserControl31_Loaded(sender As Object, e As RoutedEventArgs) 
Handles Me.Loaded
  Dim uri As Uri = New Uri("
http://twitter.com/statuses/user_timeline/ppedv.rss")
  Dim clt As SyndicationClient = New SyndicationClient()
feed = Await clt.RetrieveFeedAsync(uri)
  listview1.ItemsSource = feed.ItemsEnd Sub

Die Darstellung erfolgt im WinRT Listview Control. In diesem soll dann per Search Charme gesucht werden können. Bereits verwendete Suchphrasen werden sogar schon seitlich vorgeschlagen.

image

Die Anwendung muss nur das Event der auftauchenden SearchPane abonnieren, hier mit onQuerySubmitted.  In den Feed Elementen wird dann per LINQ eine Abfrage durchgeführt und dem Listview wiederum zugewiesen.

 Dim feed As SyndicationFeed
    WithEvents sp As SearchPane = SearchPane.GetForCurrentView
    Public Sub OnQuerySubmitted(ByVal sender As Object,
ByVal args As SearchPaneQuerySubmittedEventArgs) Handles sp.QuerySubmitted
        Dim q = From i In feed.Items
                      Where i.Title.Text.ToLower.Contains(args.QueryText.ToLower)
                            Select i
        listview1.ItemsSource = q
        TextBox1.Text = "Suche nach " & args.QueryText
    End Sub

Kommentar schreiben