【问题标题】:getting autocomplete box with possible places (addresses) Windows phone获取带有可能位置(地址)的自动完成框 Windows phone
【发布时间】:2014-09-28 09:13:11
【问题描述】:

几天以来,我在网上搜索解决方案。 我想要实现的是一个自动完成的搜索框,它最后给了我搜索地址或地点的经度和纬度。

所以here 我有我需要的东西,问题是图像不见了,所以我被卡住了。

  • 如何将文本框的内容发送到我的位置 api url(在我的 TextChange 事件处理程序中)

  • 如何读取事件处理程序中的 json 响应并将其绑定到我的 LisBox 项?

  • 最后一点,我如何获得所选项目的经度和纬度,以便我可以使用它?

这里是事件处理程序和 xaml 代码

private void SearchForTerm(object sender, System.Windows.Controls.TextChangedEventArgs e)
    {
        //??
    }

<TextBox 
      Foreground="Gray" 
      Text="Search Location"
      TextWrapping="Wrap" 
      Margin="0,470,0,0" 
      Height="72" 
      VerticalAlignment="Top" 
      AcceptsReturn="True" 
      GotFocus="TextBox_GotFocus"
      LostFocus="TextBox_LostFocus" 
      TextChanged="SearchForTerm"
      />

<ListBox x:Name="Suggestion_listbox" 
         Margin="12,65,0,179">

</ListBox>

非常感谢。

【问题讨论】:

    标签: c# json windows-phone-8 autocomplete location


    【解决方案1】:

    我认为您可以使用 WPToolkit 中的 AutoCompleteBox,这将非常方便且易于使用。有很多关于此的教程,这里是 one

    如果您想在每个文本更改事件后获取结果,那么您可以使用带有更改文本的 WebClient 调用该 Web 服务。我不确定该位置 api,但这里是一个从 OpenWeatherMapAPI 获取当前天气信息的示例.您也可以在您的情况下使用它来获取数据。

    WebClient wc = new WebClient();
    wc.DownloadStringCompleted+=wc_DownloadStringCompleted;
    wc.DownloadStringAsync(new Uri("http://api.openweathermap.org/data/2.5/weather?q="+location +"&units=metric",UriKind.Absolute));
    

    从 Web 服务获得响应后,您可以使用 JSON.NET 反序列化 JSON 响应并将 json 响应映射到 c# 类,您可以使用此 Web 工具 - json2csharp 这是我示例的 DownloadStringCompleted 事件处理程序。

    void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
         if (!string.IsNullOrEmpty(e.Result))
         {
                WeatherData weatherDt = JsonConvert.DeserializeObject<WeatherData>(e.Result);
         }
    }
    

    这里 WeatherData 是该 Json 响应的根对象。您可以使用 JsonConvert.DeserializeObject(e.Result) 将 json 响应映射到 WeatherData 对象;

    要列出DataBinding,请参阅此question 的解决方案。

    要将所选项目作为对象获取,您可以使用 Tap 事件处理程序。

     private void Suggestion_listbox_Tap(object sender, System.Windows.Input.GestureEventArgs e)
     {
            ListBox list = sender as ListBox;
            ClassName obj = list.SelectedItem as ClassName;
     } 
    

    【讨论】:

    • 谢谢,我认为这会起作用。但我还有一个问题:行:RootObject json = JsonConvert.DeserializeObject(e.Result);总是必须是 RootObject?因为我需要地址,而且它(怎么说)在 json 响应中“更深”.. 对不起我的英语 :)
    • 每个 RootObject 都必须包含对整个 JSON 响应及其对应类的引用对象。就像我想从示例的 api 中获取最高温度一样,我可以从 weatherDt.main.temp_max 中获取,其中 weatherDt 是我的 RootObject。您可以访问这样的对象的属性以从 RootObject 获取位置数据,或者只需将 rootObject 绑定到列表并使用数据绑定技术从中获取数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 2012-06-09
    • 2012-06-26
    相关资源
    最近更新 更多