我试图在服务加载时显示一个简单的进度条。我无法解释为什么这不能立即执行。
查看:
<ProgressBar x:Name="ProgressBar"
IsIndeterminate="True"
Visibility="{Binding IsLoading, Mode=OneWay, Converter={StaticResource BoolToVisiblityConverter}}" />
查看型号:
private Boolean _isLoading;
public Boolean IsLoading
{
get { return _isLoading; }
set
{
Set(ref _isLoading, value);
}
}
public SignInViewModel(INavigationService navigationService)
{
IsLoading = false;
_navigationService = navigationService;
Username = "";
SignInCommand = new RelayCommand( SignIn, CanSignIn);
}
private async void SignIn()
{
// DispatcherHelper.CheckBeginInvokeOnUI(() =>
// {
IsLoading = true;
RaisePropertyChanged("IsLoading");
// });
var response = await OrchestratorContext.Instance.SignInWithPassword(_username, _password);
if (response.IsSuccessful)
{
// _navigationService.NavigateTo("LandingPage");
}
}
进度条直到登录功能完成后才开始加载。我尝试过使用调度程序,并尝试在设置后更改属性。有什么建议吗?
答案 0 :(得分:1)
我不确定这是否是最佳方法,但我通过强制新线程来实现它。有更好的方法吗?
private void SignIn()
{
IsLoading = true;
Task.Factory.StartNew(async () =>
{
var response = await OrchestratorContext.Instance.SignInWithPassword(_username, _password);
if (response.IsSuccessful)
{
DispatcherHelper.CheckBeginInvokeOnUI(() =>
{
_navigationService.NavigateTo("LandingPage");
});
}
});
}
答案 1 :(得分:0)
你正确地注意,如果你想在你的函数中使用await,那么这个函数应该声明为异步。
但是,每个异步函数都应返回Task(如果它通常会返回void)或Task <TResult
&gt;如果它通常会返回TResult。
有一个例外:事件处理程序可以返回void而不是Task,但是,事件处理程序仍然必须声明为异步。
如果您遵循这些规则,您的用户界面仍会保持响应状态并且进度条会不断更新:
private async void Button1_clicked(object sender, ...)
{
await Signin();
}
private async Task SignIn()
{
// do some processing
var response = await OrchestratorContext...
// do some more processing
}
请注意Signin()的任务返回值
现在,在等待用户界面保持响应状态时。