Xamarin表格中的触发活动指标

时间:2015-09-01 14:01:46

标签: c# xaml xamarin

我的Xamarin.Forms应用程序上有一个图标,当点击它时,我想将其更改为活动指示器。看起来我应该使用Trigger,事件触发器看起来不错,但是当我的图像在XAML中声明时,我不确定它是如何组合在一起的?

目前,我在XAML的stacklayout

的底部有这个
<Button x:Name="NewDeviceButton" 
          Image="glyphish_31_circle_x.png" 
          HorizontalOptions="End"
          VerticalOptions="EndAndExpand" />

单击它时,我想在一段时间内显示此信息,然后触发一些C#功能:

<ActivityIndicator Color="Black" IsRunning="true" />

我不确定是否最好在XAML中使用触发器配置它,或者我是否可以在XAML中拥有占位符类型项,然后在C#中拥有所有定义?

2 个答案:

答案 0 :(得分:6)

有几种方法可以做到这一点。

你可以简单地给每个人一个x:名字然后打开/关闭IsRunning和IsVisible,如果你想隐藏它。

我假设你有一些数据绑定正在进行中。由于IsRunning是一个bool,你只需将它绑定到代码后面的布尔值即可。例如,在我的ViewModel中,我有一个IsBusy属性并实现了INotifyPropertyChanged:

public class MyViewModel : INotifyPropertyChanged
{


    public MyViewModel()
    {
    }

    private bool busy = false;

    public bool IsBusy
    {
        get { return busy; }
        set
        {
            if (busy == value)
                return;

            busy = value;
            OnPropertyChanged("IsBusy");
        }
    }


    public async Task GetMonkeysAsync()
    {
        if (IsBusy)
            return;


        try
        {
            IsBusy = true;

            //do stuff here that is going to take a while

        }
        finally
        {
            IsBusy = false;
        }
    }

    #region INotifyPropertyChanged implementation

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(string name)
    {
        var changed = PropertyChanged;
        if (changed == null)
            return;

        changed(this, new PropertyChangedEventArgs(name));

    }

    #endregion
}

然后在XAML中你可以绑定到IsBusy:

<ActivityIndicator IsRunning="{Binding IsBusy}"
                       Color="Blue"/>

我认为应该处理它。如果你需要一个计时器,你可以使用我在这里的相同绑定,并使用内置计时器类的Xamarin.Forms。

答案 1 :(得分:4)

詹姆斯的回答是正确的,但是,我更喜欢使用页面自己的IsBusy属性,原因有两个:

  1. 我很懒,我不想设置INotifyPropertyChanged实施,如果我不需要
  2. XF是suppossed to use that property to display a notification by default。这看起来似乎没有用,但是如果有的话,这种方法已经让我们可以利用它了
  3. 与James的回答(除了删除INPC实现之外)的唯一区别在于,您需要为页面命名(x:Name="myPage"),然后使用{Binding Source={x:Reference myPage}, Path=IsBusy}使用对它的引用来声明绑定对于ActivityIndi​​cator的IsVisibleIsRunning值。

    即:

    MainPage.xaml中:

    <ContentPage ... x:Name="myPage">
        ...
        <ActivityIndicator IsVisible="{Binding Source={x:Reference myPage}, Path=IsBusy}" IsRunning="{Binding Source={x:Reference myPage}, Path=IsBusy}" />
        ...
    </ContentPage>
    

    MainPage.xaml.cs中:

    ...
    async void OnDoSomethingLong(...)
    {
        if (!this.IsBusy)
        {
            try
            {
                this.IsBusy = true;
    
                //await long operation here, i.e.:
                await Task.Run(() => {/*your long code*/});
            }
            finally
            {
                this.IsBusy = false;
            }
        }
    }
    ...