2015-09-01 4 views
4

У меня есть значок в приложении Xamarin.Forms, который, когда он щелкнут, я хотел бы изменить его на индикатор активности. Похоже, что я должен использовать Trigger, Event Triggers выглядят хорошо, но поскольку мое изображение объявлено в XAML, я не совсем уверен, как он будет сочетаться?Индикатор активности запуска в формах Xamarin

На данный момент у меня есть это в 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#?

ответ

6

Есть несколько способов сделать это.

Вы можете просто указать каждому из них x: Name, а затем включить/выключить 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, встроенные в класс таймера.

+0

вы выбрали имя свойства задница IsBusy специальный отбор? потому что страница также имеет свойство IsBussy. привязка данных работает с элементом DataContext, но в любом случае. Мне интересно, почему IsBusy? https://developer.xamarin.com/api/property/Xamarin.Forms.Page.IsBusy/ –

+0

Это то, что я всегда называл свойством, но это может быть любое имя, которое вы хотите. – JamesMontemagno

+0

ОК, я вижу. это только сходство имени. –

3

ответ Джеймса является правильным, однако, я предпочитаю использовать страницу собственного IsBusy собственности, по двум причинам:

  1. Я ленивый, и я не хочу, чтобы настройки INotifyPropertyChanged реализации, если я не обязательно
  2. XF is suppossed to use that property to display a notification by default. Это, похоже, не работает, но если это когда-либо будет сделано, то этот подход уже позволит нам покрыть его, чтобы воспользоваться этим.

Единственная разница с ответом Джеймса (помимо удаления реализации INPC) заключается в том, что вы необходимо указать имя страницы (x:Name="myPage"), а затем объявить привязку, используя ссылку на нее, с помощью {Binding Source={x:Reference myPage}, Path=IsBusy} для значений ActivityIndicator IsVisible и IsRunning.

т.е .:

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; 
     } 
    } 
} 
... 
Смежные вопросы