Yiy*_*hen 1 loading spinner xamarin xamarin.forms
我正在使用 Xamarin.Forms 开发跨平台移动应用程序。
我正在尝试使用简单的活动指示器和 I 按钮来模拟 Web 服务上的 POST。我希望单击按钮时活动指示器会显示并保持不变,直到 IsLoading 属性设置为 false。
这是我的 XAML:
<AbsoluteLayout x:Name="layOuter">
<ActivityIndicator x:Name="actWebRequest"
IsVisible="{ Binding IsLoading,
Mode=TwoWay }"
IsRunning="{ Binding IsLoading,
Mode=TwoWay }"
AbsoluteLayout.LayoutBounds="0.5, 0.5, 100, 100"
AbsoluteLayout.LayoutFlags="PositionProportional" />
<Button x:Name="btnLogin"
IsVisible="{ Binding Show,
Mode=TwoWay }"
Text="{ StaticResource LoginButtonText }"
Command="{ Binding LoginCommand }"
BackgroundColor="Teal" />
</AbsoluteLayout>
Run Code Online (Sandbox Code Playgroud)
他的登录命令:
公共事件 PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
protected void SetValue<T>(ref T backingField, T value, [CallerMemberName] string propertyName = null)
{
if (EqualityComparer<T>.Default.Equals(backingField, value))
return;
backingField = value;
OnPropertyChanged(propertyName);
}
private bool _isLoading;
private bool _show;
public bool IsLoading { get { return _isLoading; } set { SetValue(ref _isLoading, value); } }
public bool Show { get { return _show; } set { SetValue(ref _show, value); } }
private void Login()
{
IsLoading = true;
Show = false;
// DoSomething()
System.Threading.Tasks.Task.Delay(5000).Wait();
IsLoading = false;
Show = true;
}
Run Code Online (Sandbox Code Playgroud)
点击“登录”按钮不会发生任何事情,5 秒后应用程序将导航到另一个应用程序。我也尝试过 ACR 用户对话框,但它不起作用。
我的应用程序必须兼容 Android 和 iOS。
你能帮助我吗?谢谢。
编辑:
是的,我通过这种方式将页面绑定到WievModel:
public class ContentBase<T> : ContentPage where T : class, new()
{
public T ViewModel
{
get { return BindingContext as T; }
set { BindingContext = value; }
}
public ContentBase() { ViewModel = new T(); }
}
public class LoginPageBase : ContentBase<LoginViewModel> { }
public partial class LoginPage : LoginPageBase
{
public LoginPage()
{
InitializeComponent();
}
protected override bool OnBackButtonPressed()
{
return true;
}
}
public class LoginViewModel : ViewModelBase
{
private bool _isLoading;
private bool _show;
public bool IsLoading { get { return _isLoading; } set { SetValue(ref _isLoading, value); } }
public bool Show { get { return _show; } set { SetValue(ref _show, value); } }
}
Run Code Online (Sandbox Code Playgroud)
我的意思是,当我点击登录按钮时,即使我将 IsLoading 设置为 true,活动指示器也不会显示。
问题很明显:
System.Threading.Tasks.Task.Delay(5000).Wait();
Run Code Online (Sandbox Code Playgroud)
Wait()您正在使用, wait阻塞主线程:
await System.Threading.Tasks.Task.Delay(5000);
Run Code Online (Sandbox Code Playgroud)
然后您应该会看到活动指示器。
| 归档时间: |
|
| 查看次数: |
5048 次 |
| 最近记录: |