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.
Wie üblich muss zunächst im Manifest die Declaration search aktiviert werden. Dann wird eine neue Seite mit dem Template “Search Contract” erstellt.
\
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.
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