利用webxml來構建wp的天氣預報

在wp裏,我們可以根據一些網站的API來達到一些目的。例如獲取天氣預報就是這樣。在http://www.webxml.com.cn/zh_cn/index.aspx這個網址裏提供一些api供我們使用。

首先,新建一個項目,然後修改前臺界面代碼。

View Code
<Grid x:Name="LayoutRoot">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <!--ContentPanel - place additional content here-->
        <Grid x:Name="ContentPanel" Grid.Row="0" Margin="12,0,12,0">
            <Button  Height="72" HorizontalAlignment="Left" Margin="354,97,0,0" Name="btn_search" VerticalAlignment="Top" Width="72" Click="btn_search_Click" BorderBrush="Black">
                <Button.Background>
                    <ImageBrush ImageSource="/wp7-weather;component/Images/search.png" />
                </Button.Background>
            </Button>
            <TextBox Height="72" HorizontalAlignment="Left" Margin="12,42,0,0" Name="txt_search" VerticalAlignment="Top" Width="438" Opacity="1" />
            <TextBlock Height="34" HorizontalAlignment="Left" Margin="24,20,0,0" Name="textBlock1" Text="請輸入你要查詢天氣的城市名:" VerticalAlignment="Top" Foreground="Black"></TextBlock>
        </Grid>
        <StackPanel Orientation="Vertical" Grid.Row="1">
            <ListBox>
            <StackPanel Orientation="Horizontal">
                <Image Width="100" Height="100" Name="img_today" Margin="40,10,5,0"></Image>
                <StackPanel Orientation="Vertical">
                        <TextBlock x:Name="lbl_today" Text="" FontSize="32" Margin="50,10,0,0" VerticalAlignment="Center" Foreground="Black"/>
                        <TextBlock x:Name="lbl_wind" Text=""  FontSize="32" Margin="50,0,0,0"  VerticalAlignment="Center" Foreground="Black"/>
                        <TextBlock x:Name="lbl_temp" Text=""  FontSize="32" Margin="50,0,0,0"  VerticalAlignment="Center" Foreground="Black"/>
                </StackPanel>
            </StackPanel>
            <StackPanel Orientation="Horizontal">
                    <Image Width="100" Height="100" Name="img_today1" Margin="40,10,5,0"></Image>
                <StackPanel Orientation="Vertical">
                        <TextBlock x:Name="lbl_today1" Text="" FontSize="32" Margin="50,10,0,0" VerticalAlignment="Center" Foreground="Black"/>
                        <TextBlock x:Name="lbl_wind1" Text=""  FontSize="32" Margin="50,0,0,0"  VerticalAlignment="Center" Foreground="Black"/>
                        <TextBlock x:Name="lbl_temp1" Text=""  FontSize="32" Margin="50,0,0,0"  VerticalAlignment="Center" Foreground="Black"/>
                </StackPanel>
            </StackPanel>
                <StackPanel Orientation="Horizontal">
                    <Image Width="100" Height="100" Name="img_today2" Margin="40,10,5,0"></Image>
                    <StackPanel Orientation="Vertical">
                        <TextBlock x:Name="lbl_today2" Text="" FontSize="32" Margin="50,10,0,0" VerticalAlignment="Center" Foreground="Black"/>
                        <TextBlock x:Name="lbl_wind2" Text=""  FontSize="32" Margin="50,0,0,0"  VerticalAlignment="Center" Foreground="Black"/>
                        <TextBlock x:Name="lbl_temp2" Text=""  FontSize="32" Margin="50,0,0,0"  VerticalAlignment="Center" Foreground="Black"/>
                    </StackPanel>
                </StackPanel>
                <StackPanel Orientation="Horizontal">
                    <Image Width="100" Height="100" Name="img_today3" Margin="40,10,5,0"></Image>
                    <StackPanel Orientation="Vertical">
                        <TextBlock x:Name="lbl_today3" Text="" FontSize="32" Margin="50,10,0,0" VerticalAlignment="Center" Foreground="Black"/>
                        <TextBlock x:Name="lbl_wind3" Text=""  FontSize="32" Margin="50,0,0,0"  VerticalAlignment="Center" Foreground="Black"/>
                        <TextBlock x:Name="lbl_temp3" Text=""  FontSize="32" Margin="50,0,0,0"  VerticalAlignment="Center" Foreground="Black"/>
                    </StackPanel>
                </StackPanel>
                <StackPanel Orientation="Horizontal">
                    <Image Width="100" Height="100" Name="img_today4" Margin="40,10,5,0"></Image>
                    <StackPanel Orientation="Vertical">
                        <TextBlock x:Name="lbl_today4" Text="" FontSize="32" Margin="50,10,0,0" VerticalAlignment="Center" Foreground="Black"/>
                        <TextBlock x:Name="lbl_wind4" Text=""  FontSize="32" Margin="50,0,0,0"  VerticalAlignment="Center" Foreground="Black"/>
                        <TextBlock x:Name="lbl_temp4" Text=""  FontSize="32" Margin="50,0,0,0"  VerticalAlignment="Center" Foreground="Black"/>
                    </StackPanel>
                </StackPanel>
            </ListBox>
        </StackPanel>
        <Grid.Background>
            <ImageBrush ImageSource="/wp7-weather;component/Images/water.png" />
        </Grid.Background>
    </Grid>

打開上面那個網址,我們可以看到下面有一個2500城市天氣預報,點擊進去,可以看到有很多方法供我們調用:

我們需要的就是下面的getWeather這個方法。

點擊進去之後隨便輸入一個城市,返回給我們的是xml格式的信息:

接下來,回到項目,添加一個服務引用,地址就是上面2500城市天氣的網址。

添加完之後我們就可以實現api的調用了。

在後臺添加好相應的對象實例化,同時實例化一個list來存放反饋的信息

ServiceReference1.WeatherWSSoapClient w = new ServiceReference1.WeatherWSSoapClient();
List<string> msg = new List<string>();

然後在按鈕事件裏獲取要查詢的城市名稱並異步發送,同時接收返回信息:

private void btn_search_Click(object sender, RoutedEventArgs e)
        {
            w.getWeatherAsync(txt_search.Text.ToString(), "");
            w.getWeatherCompleted += new EventHandler<ServiceReference1.getWeatherCompletedEventArgs>(w_getWeatherCompleted);
        }

上面的getWeatherAsync的兩個參數就是城市名和id,id可以忽略爲空。

w_getWeatherCompleted方法:

View Code
void w_getWeatherCompleted(object sender, ServiceReference1.getWeatherCompletedEventArgs e)
        {
            if (e.Error == null)
            {
                try
                {
                    for (int i = 0; i < e.Result.Length; i++)
                    {
                        string s = e.Result[i];
                        msg.Add(s);
                    }
                    if (msg.Count > 0)
                    {
                        setMsg();
                    }
                }
                catch (Exception)
                {
                    MessageBox.Show("灰常遺憾,親,網絡有誤或者地名有誤~");
                }
            }
            
        }

然後再在後臺調用一個方法給前臺的控件賦值(在這裏我圖方便,所以用了很多控件,其實可以用一個listbox來解決的。不過這裏就不重複了)。

同時,我們根據返回的字符串來綁定相應的圖片,圖片的命名格式我也改了,隨後會在代碼附件裏有。

View Code
public void setMsg()
        {
            lbl_today.Text = msg[7];
            lbl_temp.Text = msg[8];
            lbl_wind.Text = msg[9];
            img_today.Source = setImg(msg[10]);

            lbl_today1.Text = msg[12];
            lbl_temp1.Text = msg[13];
            lbl_wind1.Text = msg[14];
            img_today1.Source = setImg(msg[15]);

            lbl_today2.Text = msg[17];
            lbl_temp2.Text = msg[18];
            lbl_wind2.Text = msg[19];
            img_today2.Source = setImg(msg[20]);

            lbl_today3.Text = msg[22];
            lbl_temp3.Text = msg[23];
            lbl_wind3.Text = msg[24];
            img_today3.Source = setImg(msg[25]);

            lbl_today4.Text = msg[27];
            lbl_temp4.Text = msg[28];
            lbl_wind4.Text = msg[29];
            img_today4.Source = setImg(msg[30]);
        }
        public BitmapImage setImg(string str)
        {
            Uri uri = new Uri("Images/" + str.Substring(0, str.IndexOf('.')) + ".png", UriKind.Relative);
            BitmapImage bmp = new BitmapImage(uri);
            return bmp;
        }

 編譯運行就可以了。

代碼附件:http://dl.vmall.com/c0av1w2cmb 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章