Xamarin.forms 沙马林形式->;如果要执行语句的命令,则活动指示器不工作
使用Visual Studio 2017社区15.8.1 这是在检查了有关ActivityIndicator的stackoverflow的所有选项之后。因此,虽然这可能是一个重复,但没有什么是帮助我了。 所以最后决定发布我的训练,并从这里得到最好的帮助 我迄今为止所尝试的:-Xamarin.forms 沙马林形式->;如果要执行语句的命令,则活动指示器不工作,xamarin.forms,visual-studio-2017,Xamarin.forms,Visual Studio 2017,使用Visual Studio 2017社区15.8.1 这是在检查了有关ActivityIndicator的stackoverflow的所有选项之后。因此,虽然这可能是一个重复,但没有什么是帮助我了。 所以最后决定发布我的训练,并从这里得到最好的帮助 我迄今为止所尝试的:- 1.{Binding IsLoading}+INotifyPropertyChanged+public void RaisePropertyChanged(string propName)+IsLoading=true;概
1.{Binding IsLoading}+INotifyPropertyChanged+public void RaisePropertyChanged(string propName)+IsLoading=true;概念。
2.ActivityIndicator_Busy.IsVisible=false;(直接控制访问) 这两种方法大部分都是推荐的,我在过去几周花了很多时间深入研究了每种方法。但什么都没有 我取得了什么成就?:-
ActivityIndicator_Busy.IsVisible=false;只有当我在执行语句之前输入return(用于测试目的)时,概念才能顺利工作;关于按钮单击事件的语句。(附图) 但一旦我删除返回;按下按钮,稍停片刻后,主页立即打开 我的问题:-
1.在当前场景中,当用户单击欢迎按钮时,如何立即运行ActivityIndicator是一个特殊的问题。
2.同样,当应用程序启动时,也会出现一个空白的白色屏幕,持续数秒,几乎30秒,我也想显示ActivityIndicator。但我不知道在哪种情况下该如何强加这种逻辑 我的输入 My MainPage.xaml文件:- (2018年9月6日晚上9:11编辑)
2018年10月4日
最终通过解决
更新2018-09-10
通过将INotifyPropertyChanged
添加到类定义并添加事件,您认为您已经实现了INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
以及它的事件invocator
public void RaisePropertyChanged(string propName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
无论如何,由于ContentPage
已经实现了INotifyPropertyChanged
,添加那些没有实现INotifyPropertyChanged
ContentPage
已经定义了事件(或者更确切地说,BindableObject
间接继承了该事件)。任何依赖于获得页面中属性更改的通知的对象都将订阅祖先的PropertyChanged
事件,而不是您定义的PropertyChanged
事件,因此ActivityIndicator
不会更新
只需删除您定义的事件并调用OnPropertyChanged
,而不是RaisePropertyChanged()
,就可以了
private bool isLoading;
public bool IsLoading
{
get
{
return isLoading;
}
set
{
isLoading = value;
OnPropertyChanged();
}
}
因为OnPropertyChanged
被声明为
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
您不必手动传递属性名称。编译器将使用CallerMemberNameAttribute
为您执行此操作
结束更新
XAML扩展{Binding IsLoading}
将ActivityIndicator
绑定到页面的BindingContext
。默认情况下,BindingContext
为null
,因此没有任何可绑定的内容,您的所有努力都是徒劳的
使用viewmodel
首选的解决方案是使用viewmodel并将其分配给MainPage.BindingContext
,例如
var page = new MainPage()
{
BindingContext = new MainPageViewModel()
}
但是,如果您走这条路,您应该将所有UI逻辑移动到该viewmodel,并将SQL访问和业务逻辑封装在其他类中,以保持viewmodel与资源访问和业务逻辑的清洁。在代码中包含资源访问和逻辑可能适用于这个小示例,但可能会变成无法维护的混乱
没有视图模型
无论如何,您不必使用viewmodel来使用绑定。您可以为页面(或某些子页面)设置BindingContext
,或使用BindingExtension的源代码
设置BindingContext
BindingContext
从任何页面或视图传递到其子级。您首先必须使用x:name=“page”
为页面命名(不必使用page
,无论如何,您不能使用页面的类名),并将BindingContext
设置为该页面
<ContentPage ...
x:Name="Page"
BindingContext="{x:Reference Page}"
...>
现在您可以在绑定中引用它
<ActivityIndicator
...
IsRunning="{Binding Path=IsLoading, Source={x:Reference Page}}"
IsVisible="{Binding Path=IsLoading, Source={x:Reference Page}}"/>
更新2018-09-10
通过将INotifyPropertyChanged
添加到类定义并添加事件,您认为您已经实现了INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
以及它的事件invocator
public void RaisePropertyChanged(string propName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
无论如何,由于ContentPage
已经实现了INotifyPropertyChanged
,添加那些没有实现INotifyPropertyChanged
ContentPage
已经定义了事件(或者更确切地说,BindableObject
间接继承了该事件)。任何依赖于获得页面中属性更改的通知的对象都将订阅祖先的PropertyChanged
事件,而不是您定义的PropertyChanged
事件,因此ActivityIndicator
不会更新
只需删除您定义的事件并调用OnPropertyChanged
,而不是RaisePropertyChanged()
,就可以了
private bool isLoading;
public bool IsLoading
{
get
{
return isLoading;
}
set
{
isLoading = value;
OnPropertyChanged();
}
}
因为OnPropertyChanged
被声明为
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
您不必手动传递属性名称。编译器将使用CallerMemberNameAttribute
为您执行此操作
结束更新
XAML扩展{Binding IsLoading}
将ActivityIndicator
绑定到页面的BindingContext
。默认情况下,BindingContext
为null
,因此没有任何可绑定的内容,您的所有努力都是徒劳的
使用viewmodel
首选的解决方案是