我的应用需要解析JSON文件以从网络获取信息。 当我加载应用程序时,它工作正常,但当我单击“刷新”按钮时它不会。 有人可以看看代码(C#),看看我做错了什么?
== MainPage.xaml ==
<phone:PhoneApplicationPage
x:Class="BitValue.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
shell:SystemTray.IsVisible="True">
<!--LayoutRoot è la griglia radice in cui viene inserito tutto il contenuto della pagina-->
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!-- NOTA SULLA LOCALIZZAZIONE:
Per localizzare le stringhe visualizzate copiarne i valori in chiavi denominate in modo appropriato
nel file di risorse della lingua neutra dell'applicazione (AppResources.resx) quindi
sostituire il valore del testo hard-coded tra le virgolette degli attributi
con la clausola di binding il cui percorso punta a quel nome di stringa.
Ad esempio:
Text="{Binding Path=LocalizedResources.ApplicationTitle, Source={StaticResource LocalizedStrings}}"
Questa associazione punta alla risorsa della stringa del modello denominata "ApplicationTitle".
L'aggiunta delle lingue supportate nella scheda Proprietà progetto crea un
nuovo file RESX per lingua che può trasportare i valori tradotti delle
stringhe IU. L'associazione in questi esempi farà in modo che il valore degli
attributi venga disegnato dal file RESX che corrisponde a
CurrentUICulture dell'applicazione al momento del runtime.
-->
<!--TitlePanel contiene il nome dell'applicazione e il titolo della pagina-->
<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
<TextBlock Text="BitValue" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
</StackPanel>
<!--ContentPanel - inserire ulteriore contenuto qui-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<StackPanel>
<TextBlock HorizontalAlignment="Center">values provided by bitstamp</TextBlock>
<Grid Grid.Column="4" Grid.Row="4" Margin="12,0,12,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*" ></ColumnDefinition>
<ColumnDefinition Width="1*" ></ColumnDefinition>
<ColumnDefinition Width="1*" ></ColumnDefinition>
<ColumnDefinition Width="1*" ></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="1*"></RowDefinition>
<RowDefinition Height="1*"></RowDefinition>
<RowDefinition Height="1*"></RowDefinition>
<RowDefinition Height="1*"></RowDefinition>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="LAST" Margin="5,10" Style="{StaticResource PhoneTextExtraLargeStyle}" Foreground="#FFEAB33C"/>
<TextBlock x:Name="valueLast" Grid.Row="0" Margin="5,10" Grid.ColumnSpan="3" Grid.Column="1" Style="{StaticResource PhoneTextExtraLargeStyle}"/>
<TextBlock Grid.Column="0" Grid.Row="1" Text="BID" Margin="5,10" Foreground="#FF2AB437">
</TextBlock>
<TextBlock Grid.Column="2" Grid.Row="1" Text="ASK" Margin="5,10" Foreground="#FFE83131">
</TextBlock>
<TextBlock Grid.Column="0" Grid.Row="2" Text="24H LOW" Foreground="#FFEAB33C" Margin="5,10"></TextBlock>
<TextBlock Grid.Column="2" Grid.Row="2" Text="24H HIGH" Foreground="#FFEAB33C" Margin="5,10"></TextBlock>
<TextBlock x:Name="ValueBid" Grid.Column="1" Grid.Row="1" Margin="5,10"></TextBlock>
<TextBlock x:Name="ValueAsk" Grid.Column="3" Grid.Row="1" Margin="5,10"></TextBlock>
<TextBlock x:Name="ValueLow" Grid.Column="1" Grid.Row="2" Margin="5,10"></TextBlock>
<TextBlock x:Name="ValueHigh" Grid.Column="3" Grid.Row="2" Margin="5,10"></TextBlock>
</Grid>
</StackPanel>
</Grid>
<!--Rimuovere il commento per vedere la griglia di allineamento che consenta di verificare che i controlli siano
allineati ai limiti comuni. L'immagine ha un margine superiore di -32px tenendo
conto della barra delle applicazioni. Impostarlo su 0 (o eliminare tutti i margini)
se la barra delle applicazioni è nascosta.
Prima della spedizioni, eliminare questo XAML e l'immagine stessa.-->
<!--<Image Source="/Assets/AlignmentGrid.png" VerticalAlignment="Top" Height="800" Width="480" Margin="0,-32,0,0" Grid.Row="0" Grid.RowSpan="2" IsHitTestVisible="False" />-->
</Grid>
<phone:PhoneApplicationPage.ApplicationBar>
<shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
<shell:ApplicationBarIconButton IconUri="/Assets/refresh2.png" Text="refresh" Click="refreshClick"/>
<shell:ApplicationBar.MenuItems>
<shell:ApplicationBarMenuItem Text="about"/>
</shell:ApplicationBar.MenuItems>
</shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>
</phone:PhoneApplicationPage>
== MainPage.xaml.cs ==
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using BitValue.Resources;
using System.Runtime.Serialization.Json;
namespace BitValue
{
public partial class MainPage : PhoneApplicationPage
{
// Costruttore
public MainPage()
{
InitializeComponent();
Loaded += OnLoaded;
// Codice di esempio per localizzare la ApplicationBar
//BuildLocalizedApplicationBar();
}
private void OnLoaded(object sender, RoutedEventArgs e)
{
refresh();
}
private void refreshClick(object sender, EventArgs e)
{
refresh();
}
private void refresh()
{
var webClient = new WebClient();
webClient.OpenReadCompleted += OnOpenReadCompleted;
webClient.OpenReadAsync(new Uri("https://www.bitstamp.net/api/ticker/", UriKind.Absolute));
}
private void OnOpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
var serializer = new DataContractJsonSerializer(typeof(Result));
var Result = (Result)serializer.ReadObject(e.Result);
valueLast.Text = Result.LAST + " USD/BTC";
ValueAsk.Text = Result.ASK;
ValueBid.Text = Result.BID;
ValueLow.Text = Result.LOW;
ValueHigh.Text = Result.HIGH;
}
}
// Codice di esempio per la realizzazione di una ApplicationBar localizzata
//private void BuildLocalizedApplicationBar()
//{
// // Imposta la barra delle applicazioni della pagina su una nuova istanza di ApplicationBar
// ApplicationBar = nuova ApplicationBar();
// // Crea un nuovo pulsante e imposta il valore del testo sulla stringa localizzata da AppResources.
// ApplicationBarIconButton appBarButton = new ApplicationBarIconButton(new Uri("/Assets/AppBar/appbar.add.rest.png", UriKind.Relative));
// appBarButton.Text = AppResources.AppBarButtonText;
// ApplicationBar.Buttons.Add(appBarButton);
// // Crea una nuova voce di menu con la stringa localizzata da AppResources.
// ApplicationBarMenuItem appBarMenuItem = new ApplicationBarMenuItem(AppResources.AppBarMenuItemText);
// ApplicationBar.MenuItems.Add(appBarMenuItem);
//}
}
== Result.cs ==
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Serialization;
namespace BitValue
{
[DataContract]
public class Result
{
[DataMember(Name = "last")]
public string LAST
{
get;
set;
}
[DataMember(Name = "ask")]
public string ASK
{
get;
set;
}
[DataMember(Name = "bid")]
public string BID
{
get;
set;
}
[DataMember(Name = "low")]
public string LOW
{
get;
set;
}
[DataMember(Name = "high")]
public string HIGH
{
get;
set;
}
[DataMember(Name = "timestamp")]
public string TIMESTAMP
{
get;
set;
}
}
}
提前致谢。
答案 0 :(得分:0)
问题在于您的代码实际上看起来。 。 。行!问题出在API中,你得到一个缓存的结果(所以第二次,webclient返回缓存)