Xamarin Android ProgressBar



我正在努力在Xamarin Android的MVVMCross结构中使用ProgressBar。最初,我想将进度条的可见性绑定到视图模型中的字段。事实证明这很困难,我尝试了几种排列并从这里尝试了建议:如何在android MvvmCross Xamarin中设置进度条的可见性

我确实还有其他元素,例如按钮,我已经能够成功地绑定到项目中的其他位置,所以我不确定为什么这是一个如此大的问题。经过多次尝试,我决定尝试在视图模型中务实地设置可见性。我已经尝试了几种方法,但我最终认为肯定不起作用。

Xaml:

<ProgressBar
android:id="@+id/progressBarMap"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:visibility="gone"
style="@android:style/Widget.ProgressBar.Large" />

我尝试过使用和不使用默认可见性。我已经尝试了 local:MvxBind 使用几种普通的绑定方法,然后使用自定义转换器或可见性插件。

在我的 Fragment 中,我很遗憾地在我的 ViewModel 中设置了一个 FragmentActivity 属性,只是为了看看我是否可以让它以某种形式工作(OnCreateView(:

ViewModel.FragActivity = this.Activity;
ViewModel.Progress = view.FindViewById<Android.Widget.ProgressBar>(Resource.Id.progressBarMap);

请注意,我还尝试将进度条设置为名为"进度"的字段,并在视图模型中使用它。

这是我在视图模型中操作进度条的地方:

private void AddOfflinePoints()
{
try
{
FragActivity.RunOnUiThread(() => 
{
//I've also tried using the above Progress property. That wasn't null but did not update.
ProgressBar barOfProgression = FragActivity.FindViewById<ProgressBar>(Resource.Id.progressBarMap);
//barOfProgression is null :(
barOfProgression.Visibility = ViewStates.Visible;
barOfProgression.Enabled = true;
});
//Code to run while spinning the progress bar (It is inside Task.Run)
}
catch (Exception)
{
//Exception Handling code...
}
FragActivity.RunOnUiThread(() => Progress.Visibility = ViewStates.Gone);
}

我做错了什么?我已经尝试了许多排列,谷歌上的任何东西,并查阅了有限的Xamarin文档。任何帮助或指示都非常感谢。

谢谢。

事实证明,问题是链接器删除了可见性属性。我从这篇文章中得到了这个想法:可见性绑定失败

我在LinkerPleaseInclude中添加了以下代码:

public static void Include(ProgressBar progressBar)
{
progressBar.Click += (s, e) => progressBar.Visibility = progressBar.Visibility - 1;
}

如果有人好奇我是怎么做到的,下面是代码:

Xaml:

<ProgressBar
android:id="@+id/progressBarMap"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
local:MvxBind="Visibility Visibility(ShowProgress)"
style="@android:style/Widget.ProgressBar.Large" />

视图模型:

private bool _showProgress;
public bool ShowProgress
{
get => _showProgress;
set => SetProperty(ref _showProgress, value);
}

其中 SetProperty 来自 MvxNotifyPropertyChanged 类。