2013-11-04 8 views
6

Ich versuche, die SearchBox Steuerung in Windows 8.1 eingeführt, aber ich kann nicht herausfinden, wie das Bild in den Ergebnisvorschlägen angezeigt wird. Die Vorschläge erscheinen, aber der Raum, in dem das Bild bleibt leer sein sollte:Bild nicht gezeigt für Ergebnisvorschläge in SearchBox

enter image description here

Hier ist meine XAML:

<SearchBox SuggestionsRequested="SearchBox_SuggestionsRequested" /> 

Und mein Code hinter:

private async void SearchBox_SuggestionsRequested(SearchBox sender, SearchBoxSuggestionsRequestedEventArgs args) 
    { 
     var deferral = args.Request.GetDeferral(); 
     try 
     { 
      var imageUri = new Uri("ms-appx:///test.png"); 
      var imageRef = await StorageFile.GetFileFromApplicationUriAsync(imageUri); 
      args.Request.SearchSuggestionCollection.AppendQuerySuggestion("test"); 
      args.Request.SearchSuggestionCollection.AppendSearchSeparator("Foo Bar"); 
      args.Request.SearchSuggestionCollection.AppendResultSuggestion("foo", "Details", "foo", imageRef, "Result"); 
      args.Request.SearchSuggestionCollection.AppendResultSuggestion("bar", "Details", "bar", imageRef, "Result"); 
      args.Request.SearchSuggestionCollection.AppendResultSuggestion("baz", "Details", "baz", imageRef, "Result"); 
     } 
     finally 
     { 
      deferral.Complete(); 
     } 
    } 

Bin ich fehlt etwas?


Einige zusätzliche Details:

Ich versuchte es mit XAML Spy zu debuggen; Jeder Vorschlag ListViewItem hat seine Content auf eine Instanz von Windows.ApplicationModel.Search.Core.SearchSuggestion festgelegt. Auf diesen SearchSuggestion Objekte, bemerkte ich, dass die Text, Tag, DetailText und ImageAlternateText Eigenschaften auf ihren korrekten Wert eingestellt werden, aber die Image Eigenschaft ist null ...


EDIT: Also scheinbar AppendResultSuggestion akzeptiert nur eine Instanz von RandomAccessStreamReference, keine andere Implementierung von IRandomAccessStreamReference. Ich denke, das ist ein Fehler, da er nicht mit dem übereinstimmt, was die Methodensignatur vermittelt. I filed it on Connect, bitte stimme dafür, wenn du es reparieren willst!

Antwort

5

Die Signatur von AppendResultSuggestion fordert eine IRandomAccessStreamReference:

public void AppendResultSuggestion(
    string text, string detailText, string tag, 
    IRandomAccessStreamReference image, 
    string imageAlternateText) 

Sie es bekommen können, wenn Sie bereits eine StorageFile haben (was Sie tun) mit CreateFromFile:

RandomAccessStreamReference.CreateFromFile(IStorageFile file) 

Aber da Sie sind beginnend mit einem URI, können Sie auch den zusätzlichen Schritt überspringen und CreateFromUri verwenden:

RandomAccessStreamReference.CreateFromUri(Uri uri) 

Also würde man so etwas haben:

var imageUri = new Uri("ms-appx:///test.png"); 
var imageRef = RandomAccessStreamReference.CreateFromUri(imageUri); 
args.Request.SearchSuggestionCollection.AppendResultSuggestion("foo", "Details", "foo", imageRef, "Result") 
+2

den Cursor Locating oben 'ein Drücken der Taste' F12' Taste StorageFile', die Deklaration von 'StorageFile' zeigt. Anscheinend 'StorageFile' implementiert bereits' IRandomAccessStreamReference', warum ist eine andere Methode erforderlich? – kiewic

+1

@Kiewic eine sehr gute Frage, auf die ich keine Antwort habe. Alles, was ich weiß, ist, dass nicht alle Implementierungen von 'IRandomAccessStreamReference' gleich sind und dass' RandomAccessStreamReference' eher "leichtgewichtig" sein soll, also verwende ich es (und gut, es funktioniert;)). Vielleicht sollte es eine SO Frage sein ... – madd0

+0

Es funktioniert, danke !! Ich war mir sicher, dass es mit 'StorageFile' arbeiten sollte, da es' IRandomAccessStreamReference' implementiert. Ich hatte auch versucht, meine eigene Implementierung zu erstellen, aber es hat auch nicht funktioniert. –