2014-12-28 4 views
0

У меня очень простая страница (кнопка и указатель активности в stacklayout). Я пытаюсь использовать привязку для активации/деактивации указателя активности, используя класс уведомлений, который я написал с помощью функции INotifyPropertyChanged.Xamarin.Forms ActivityIndicator and Binding

Когда я нажимаю кнопку, я хочу, чтобы индикатор активности был видимым и работающим.

Код в событии buttonclick запускается (это ftp ... Я хотел бы сделать это async, но пока я не преуспел), свойства «bind» (видимый и запуск класса Notification), похоже, меняются статус, но указатель активности не отображается.

Я не знаю, связана ли это проблема привязки, проблема с компоновкой, o что еще. Может кто-нибудь мне помочь?

Это страница

using System; 
using Xamarin.Forms; 
using FlagFtp; 
using System.ComponentModel; 
using System.Runtime.CompilerServices; 

namespace Geco 
{ 
    public class PageFtp: ContentPage 
    { 
     private Notification _notification = new Notification(); 
     public PageFtp() 
     { 
      this.Title = "Carico database"; 

      var stacklayout = new StackLayout(); 
      stacklayout.HorizontalOptions = LayoutOptions.Center; 
      stacklayout.VerticalOptions = LayoutOptions.Center; 

      var activityIndicator = new ActivityIndicator(); 
      activityIndicator.IsEnabled = true; 
      activityIndicator.SetBinding (ActivityIndicator.IsVisibleProperty, "Visible"); 
      activityIndicator.SetBinding (ActivityIndicator.IsRunningProperty, "Running"); 
      activityIndicator.BindingContext = _notification; 

      bool okFtp = true; 
      string errorFtp = ""; 

      // Verifico se ho il database 
      var filename = DependencyService.Get<IFiles>().GetFileName (App.DB_FILENAME); 
      #if DEBUG 
      DependencyService.Get<IFiles>().Delete(filename); 
      #endif 

      var buttonRetry = new Button(); 
      buttonRetry.Text = "Procedere con il carico del database"; 
      buttonRetry.Clicked += (object sender, EventArgs e) =>{ 
       okFtp = ftp (filename, ref errorFtp); 
       if(okFtp) 
        DependencyService.Get<IOpenActivity>().OpenActivity(App.EnumForms.Login); 
       else{ 
        DisplayAlert("Errore",errorFtp,"OK"); 
       } 
      }; 

      stacklayout.Children.Add (buttonRetry); 
      stacklayout.Children.Add (activityIndicator); 
      this.Content = stacklayout; 

     } 


     private bool ftp(string filename, ref string error) { 
      System.Net.NetworkCredential credentials = new System.Net.NetworkCredential(); 
      credentials.UserName = "alessandro"; 
      credentials.Password = "ireland"; 
      bool ok = false; 
      try 
      { 
       _notification.Visible = true; 
       _notification.Running = true; 

       FlagFtp.FtpClient ftpClient = new FtpClient (credentials); 
       string uri = "ftp://192.168.0.102/GECOl.sqlite"; 
       FtpFileInfo ftpFileInfo = ftpClient.GetFileInfo (new Uri (uri)); 
       FtpStream ftpstream = ftpClient.OpenRead (ftpFileInfo); 
       byte[] buffer = new byte[ftpFileInfo.Length]; 
       ftpstream.Read (buffer, 0,(int) ftpFileInfo.Length); 
       DependencyService.Get<IFiles>().SaveBytes (filename, buffer); 
       ok = true; 
      } 
      catch(Exception ex) { 
       error = ex.Message; 
      } 
      finally { 
       _notification.Visible = false; 
       _notification.Running = false; 
      } 

      return ok; 
     } 

     public class Notification : INotifyPropertyChanged 
     { 
      private bool _visible = false ; 
      public bool Visible { 
       get { return _visible; } 
       set { 
        if (value.Equals (_visible)) 
         return; 
        _visible = value; 
        OnPropertyChanged(); 
       } 
      } 

      private bool _running = false; 
      public bool Running { 
       get { return _running; } 
       set { 
        if (value.Equals (_running)) 
         return; 
        _running = value; 
        OnPropertyChanged(); 
       } 

      } 

      public event PropertyChangedEventHandler PropertyChanged; 

      void OnPropertyChanged([CallerMemberName]String propertyName=null) 
      { 
       var handler=PropertyChanged; 
       if(handler != null) 
       { 
        handler(this, new PropertyChangedEventArgs(propertyName)); 
       } 
      } 
     } 
    } 
} 

ответ

0

Здравствуйте Я использую диалог прогресса, чтобы сделать это (Android версии). И когда я хочу, чтобы показать экран загрузки я просто использовать: LoadingViewFlag = истина/ложь, В вместо использования ContentPage Я использую мой класс (BaseContentPage):

using System; 
using Xamarin.Forms; 
#if __ANDROID__ 
using Android.App; 
#endif 

namespace SEEForgeX.Helpers 
{ 
    public class BaseContentPage : ContentPage 
    { 
     #region PRIVATE VARIABLES 
#if __ANDROID__ 
     ProgressDialog p = null; 
#endif 
     #endregion 

     #region PROPERTIES 
     public bool IsShowing { get; set; } 
     public bool LoadingViewFlag { 
      get { 
       return (bool)GetValue (LoadingProperty); 
      } 
      set { 
       SetValue (LoadingProperty, value); 

#if __ANDROID__ 
       if (value == true) 
       { 
        p = new ProgressDialog(Forms.Context); 
        p.SetMessage("Loading..."); 
        p.SetCancelable(false); 
        p.Show(); 
        IsShowing = true; 
       } 
       else 
       { 
        if (p != null) 
        { 
         p.Dismiss(); 
         p = null; 
         IsShowing = false; 
        } 
       } 
#endif 
      } 
     } 

     public static readonly BindableProperty LoadingProperty = 
      BindableProperty.Create ((BaseContentPage w) => w.LoadingViewFlag, false); 
     #endregion 

     public BaseContentPage() 
     { 
     } 
    } 
} 

пихты IOS я использую пользовательский рендерер. Дайте мне знать, если вам это нужно.