所以,我正在为wp7制作应用程序。 为了简单起见,这些是我的文件:
在MainViewModel.cs中,我包含了以下函数:
private void DownloadItems()
{
string key = this.User.Key;
WebClient wc = new WebClient();
wc.DownloadStringCompleted += callback;
wc.DownloadStringAsync(new Uri("http://localhost/items?key=" + key)); //JSON
}
和回调函数:
private void callback(object sender, DownloadStringCompletedEventArgs e)
{
if (e.Error == null)
{
List<ItemViewModel> col = Deserialize_ItemViewModel(e.Result); // deserialize JSON to List<ItemViewModel>
this.Items = new ObservableCollection<ItemViewModel>(col);
ItemDB.Sponsors.InsertAllOnSubmit(col);
ItemDB.SubmitChanges();
this.IsDataLoaded = true;
// ???
}
}
当用户登录时,将处理登录,当一切正常时,将调用DownloadItems,它使用新设置的User.Key。
我需要的是在下载完成时显示ProgressIndicator,下载完成并处理完毕后我想导航到MainPage.xaml,到那时就准备好了。
我希望有人能提前帮助我!
答案 0 :(得分:0)
我想我会尝试以不同的方式解决它。让您的LoginPage只处理登录,然后重定向到您的主页。
在您的视图模型中,对于主页面,您创建一个名为Loading
的bool属性,您可以在异步调用期间将其设置为true。将此绑定到进度条的visible属性,以便在Loading
为真时显示,使用转换器来处理bool - &gt;可见。加载数据后,您只需将Loading
设置为false,这将导致进度条消失。同时将控件/视图的visible属性绑定到Loading
,但这将使用不同的转换器,它是转换器的转换值,用于进度条。
希望这会有所帮助。
更新:我错过了您已经拥有IsDataLoaded
,是否在您的视图模型上?转换器应该类似于:
public class VisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter,
CultureInfo culture)
{
if (value != null && value is bool && parameter != null)
{
var bValue = (bool) value;
var visibility = (Visibility)Enum.Parse(
typeof (Visibility), parameter.ToString(),true);
if (bValue) return visibility;
return visibility ==
Visibility.Visible ? Visibility.Collapsed : Visibility.Visible;
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter,
CultureInfo culture)
{
throw new NotImplementedException();
}
}
然后使用它:
Visibility="{Binding IsDownloading, Converter={StaticResource VisibilityConverter}, ConverterParameter=Visible}"
示例代码取自:http://dotnetbyexample.blogspot.com/2010/11/converter-for-showinghiding-silverlight.html
答案 1 :(得分:0)
在任何异步中更新UI时,您可以按以下方式使用Dispatcher
Dispatcher.BeginInvoke(delegate
{
NavigationService.Navigate(new Uri("/Folder/pagename.xaml", UriKind.Relative));
});
我认为这对你有用。