2017-09-28 24 views
0

私はXamarinフォームで作業しています。フォームロード時にデータベースからデータを表示する必要があります。 データベース操作に時間がかかっているときに、アクティビティインジケータを表示するとします。Xamarinフォームactivityindicatorがコンストラクタで動作しません

コンストラクタのロード時にActivityIndi​​catorをtrueに設定し、最後にfalseに設定します。

しかし、そのここ

を示していないが、XAMLは

<ContentPage.Content> 
    <StackLayout VerticalOptions="StartAndExpand" Padding="5,5,5,5"> 
    <ListView HasUnevenRows="True" RowHeight="100" HeightRequest="-1" x:Name="ListViewAppointments" VerticalOptions="StartAndExpand"> 
     <ListView.ItemTemplate> 
     <DataTemplate> 
      <ViewCell> 
      <Grid Padding="20,0,20,0" ColumnSpacing="20"> 
       <Grid.RowDefinitions> 
       <RowDefinition Height="40"></RowDefinition> 
       <RowDefinition Height="40"></RowDefinition> 
       </Grid.RowDefinitions> 
       <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="40"></ColumnDefinition> 
       <ColumnDefinition Width="*"></ColumnDefinition> 
       <ColumnDefinition Width="40"></ColumnDefinition> 
       </Grid.ColumnDefinitions> 

       <!--<BoxView Color="#f7f7f7" Grid.Column="0" Grid.RowSpan="2"/> 
       <BoxView Color="#ffffff" Grid.Column="1" Grid.RowSpan="2"/>--> 
       <Image Grid.RowSpan="2" Grid.Column="0" Source="documenticon.png" Aspect="AspectFit"></Image> 
       <Label TextColor="#00344e" FontAttributes="Bold" Text="{Binding ReportName}" Grid.Row="0" Grid.Column="1" VerticalTextAlignment="End"></Label> 
       <Label TextColor="#0073ae" Text="{Binding PrintDate}" Grid.Row="1" Grid.Column="1" VerticalTextAlignment="Start"></Label> 
       <Image Grid.RowSpan="2" Grid.Column="2" Source="downloadicon.png" Aspect="AspectFit"></Image> 
      </Grid> 
      </ViewCell> 
     </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 
    <ActivityIndicator x:Name="ActLoder" HorizontalOptions="CenterAndExpand" Color="#ffffff" VerticalOptions="CenterAndExpand" /> 
    </StackLayout> 
</ContentPage.Content> 

public partial class CurrentDocuments : ContentPage 
{ 
    public CurrentDocuments() 
    { 
     InitializeComponent(); 
     new Task(Initializer).Start(); 
    } 
    public async void Initializer() 
    { 
     ShowLoader(true); 
     NavigationPage.SetBackButtonTitle(this, ""); 
     Title = "CURRENT DOCUMENTS"; 


     DocumentsResponse appointsData = null; 
     await Task.Run(async() => 
     { 
      appointsData = await GetCurrentDocuments(); 
     }).ContinueWith(_ => 
     { 
      Device.BeginInvokeOnMainThread(() => { 
       ListViewAppointments.ItemsSource = appointsData.ListOfDocuments; 
       ShowLoader(false); 
      }); 
     }); 
    } 

    private async Task<DocumentsResponse> GetCurrentDocuments() 
    { 
     DocumentManager manager = new DocumentManager(); 
     var result = await manager.GetCurrentDocuments(Application.Current.Properties["SessionId"].ToString()); 
     return result; 
    } 

    public async void ShowLoader(bool isVisible) 
    { 
     ActLoder.IsRunning = isVisible; 
     ActLoder.IsVisible = isVisible; 
     ActLoder.IsEnabled = true; 
    } 
} 

答えて

0

GetCurrentDocumentsの背後にあるコードTask<DocumentsResponse>を返して、あなたが待っていない以下のようなコード

ですそれはTaskをアクティブにします。

var appointsData = await GetCurrentDocuments(); 

しかし、あなたは.ctorawaitべきではありません。返信用

public partial class CurrentDocuments : ContentPage 
{ 
    public CurrentDocuments() 
    { 
     InitializeComponent(); 
     new Task(Initializer).Start(); 
    } 

    public async void Initializer() 
    { 
     ShowLoader(true); 
     NavigationPage.SetBackButtonTitle(this, ""); 
     Title = "CURRENT DOCUMENTS"; 
     Task<DocumentsResponse> appointsData; 
     await Task.Run(async() => 
     { 
      appointsData = await GetCurrentDocuments(); 
     }).ContinueWith(_ => 
     { 
      Device.BeginInvokeOnMainThread(() => { 
       ListViewAppointments.ItemsSource = appointsData; 
       ShowLoader(false); 
      }); 
     }); 
    } 

    public void ShowLoader(bool isVisible) 
    { 
     ActLoder.IsRunning = isVisible; 
     ActLoder.IsVisible = isVisible; 
     ActLoder.IsEnabled = true; 
    } 

    public async Task<DocumentsResponse> GetCurrentDocuments() 
    { 
     DocumentManager manager = new DocumentManager(); 
     var result = await manager.GetCurrentDocuments(Application.Current.Properties["SessionId"].ToString()); 
     return result; 
    } 
} 
+0

おかげで、私はあなたのコードといくつかの変更で自分のコードを更新しました。このような

何かが、あなたは(私はその場でこれをしなかったので、タイプミス/構文エラーの/ etcを修正し始めるだろうしかし、私はローダーを見ません..ページはすべてのデータで表示されます。 – Mahajan344

関連する問題