代码之家  ›  专栏  ›  技术社区  ›  jazzmasterkc

Xamarin Android进度条

  •  0
  • jazzmasterkc  · 技术社区  · 8 年前

    我很难在Xamarin Android的MVVMCross结构中使用ProgressBar。最初,我想将ProgressBar的可见性绑定到ViewModel中的字段。这很困难,我尝试了几种排列方式,并尝试了以下建议: How to set visibility for ProgressBar in android MvvmCross Xamarin

    我有其他的元素,比如按钮,我可以成功地绑定到我的项目中的其他地方,所以我不知道为什么这是一个大问题。经过多次尝试,我决定尝试在ViewModel中实用地设置可见性。我试过好几种方法,但我最后想的肯定行不通。

    <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" />
    

    我试过使用和不使用默认可见性。我试过了本地:MvxBind with几种常见的绑定方法,然后使用自定义转换器或可见性插件。

    在我的片段中,我遗憾地在ViewModel中设置了FragmentActivity属性,只是想看看是否可以以某种形式(OnCreateView)实现它:

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

    注意,我也尝试将ProgressBar设置为一个名为Progress的字段,并在ViewModel中使用它。

    下面是我在ViewModel中操作ProgressBar的地方:

    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文档。任何帮助或指点都非常感谢。

    1 回复  |  直到 8 年前
        1
  •  1
  •   jazzmasterkc    8 年前

    原来问题是链接器删除了Visibility属性。我从这篇文章中得到了一个想法: Visibility binding fails

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

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

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

    <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);
    }