0

WP7アプリ開発に不慣れで、WebサイトのAPIにパラメーターを渡すのに問題があります。

WP7でページを開いたときにonNavigatedTo()が最初に起動されることは理解していますが、パラメーターを取得しようとすると、webClient_DownloadStringCompleted()が最初に起動されます。

public partial class Ranks : PhoneApplicationPage
{
    private WebClient webClient;
    private string pageType;
    private string pagePosition;
    public Ranks()
    {
        InitializeComponent();
        this.webClient = new WebClient();
        string header_auth = "application/json";
        this.webClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(webClient_DownloadStringCompleted);
        this.webClient.Headers[HttpRequestHeader.Authorization] = header_auth;

        Uri serviceUri = new Uri(@"http://www.example.com/api/API.php?type=" + pageType + "&position=" + pagePosition);
        this.webClient.DownloadStringAsync(serviceUri);
    }

    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) 
    { 
        string type, position;
        if (NavigationContext.QueryString.TryGetValue("type", out type))
        {
            pageType = type;
        }
        if (NavigationContext.QueryString.TryGetValue("pos", out position))
        {
            pagePosition = position;
        }

    }


    void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        string myJsonString = e.Result;
        List<PlayerDetails> dataSource = new List<PlayerDetails>();

        //load into memory stream
        using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(myJsonString)))
        {
            //parse into jsonser
            var ser = new DataContractJsonSerializer(typeof(PlayerDetails[]));
            PlayerDetails[] obj = (PlayerDetails[])ser.ReadObject(ms);

            foreach (PlayerDetails plyr in obj)
            {   

                dataSource.Add(plyr);

            }

            playerList.ItemsSource = dataSource;

        }


    }

URI文字列が作成されるたびに、パラメータ「pageType」と「pagePosition」が欠落しています。

どんな助けでも大歓迎です!

4

1 に答える 1

0

クラスコンストラクタは常に前に呼び出されOnNavigatedToます。そのコードをコンストラクターからOnNavigatedTo(またはロード済み)に移動する必要があります。

ページの読み込みごとに1回だけ発生させたいので(つまり、ユーザーがページに戻ったときではなく)、コンストラクターにそのコードがあると思います。その場合は、を確認できますNavigationMode

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) 
    { 
        if (e.NavigationMode == NavigationMode.New)
     {
string type, position;
        if (NavigationContext.QueryString.TryGetValue("type", out type))
        {
            pageType = type;
        }
        if (NavigationContext.QueryString.TryGetValue("pos", out position))
        {
            pagePosition = position;
        }

       this.webClient = new WebClient();
        string header_auth = "application/json";
        this.webClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(webClient_DownloadStringCompleted);
        this.webClient.Headers[HttpRequestHeader.Authorization] = header_auth;

        Uri serviceUri = new Uri(@"http://www.example.com/api/API.php?type=" + pageType + "&position=" + pagePosition);
        this.webClient.DownloadStringAsync(serviceUri);

     }




    }
于 2012-07-06T05:21:22.790 に答える