2016-12-12 9 views
1

私はuwpプロジェクトでバックグラウンドワーカーを使用しています。ここでは、バックグラウンドワーカーが実行されている間に読み込みイメージを表示します。バックグラウンドワーカータスクの完了後、ローディングイメージは不可視でなければなりません。 どうすればいいですか?バックグラウンドワーカーの実行中にuwpでイメージをロードする方法

BackgroundWorker productPrices = new BackgroundWorker(); 

productPrices.DoWork += new DoWorkEventHandler(productPrices_Dowork); 
productPrices.RunWorkerCompleted += productPrices_RunWorkerCompleted; 
productPrices.WorkerSupportsCancellation = true; 
productPrices.ProgressChanged += new ProgressChangedEventHandler(productPrices_ProgressChanged); 
productPrices.WorkerReportsProgress = true; 

private async void productPrices_Dowork(object sender, DoWorkEventArgs e) 
{ 
    progressring.Visibility = Visibility.Visible; 
    await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async() => 
    { 
     string customerId = Application.Current.Resources[Constants.CUSTOMER_ID].ToString(); 
     string username = Application.Current.Resources[Constants.EMAIL_ID].ToString(); 
     string strIpAddress = Application.Current.Resources[Constants.IP_ADDRESS].ToString(); 
     string strPortNumber = Application.Current.Resources[Constants.PORT_Number].ToString(); 
     RequestHeader requestHeader = DBHelper.GetRequestHeader(customerId, customerId, username); 
     string strStoreLocation = Application.Current.Resources[Constants.STORE_LOCATION].ToString(); 
     int startIndex = 0; 
     await ProductAgent.GetProductPrices(requestHeader, strIpAddress, strPortNumber, strStoreLocation); 

    }); 
} 
+0

確かに私たちは、あなたはそれが起こっ作るために何かをしようとしたことを行うことができますか? –

+0

私の質問を編集しました – Archana

+0

実際に使用できるUWPプラットフォームには何かが組み込まれています。あなたのニーズに合っているのでしょうか、それともカスタム画像にする必要がありますか?後者の場合、いくつかのヒント – Takarii

答えて

0

あなたの問題は、あなたがあなたのDoWorkイベントハンドラで進捗リングの可視性を設定しているということです。それはあなたがこれらの線に沿って、例外を与える必要がありますので、この1は、バックグラウンドスレッドで実行されます:スロー

例外:UWP.exe

の「のSystem.Exception」

追加情報:アプリケーションはインターフェースと呼ばれますそれは別のスレッドのためにマーシャリングされました。 (HRESULTからの例外:0x8001010E(RPC_E_WRONG_THREAD))

移動し、この行:

progressring.Visibility = Visibility.Visible; 

...あなたはRunWorkerAsyncを呼び出すどこへ。それがバックグラウンドスレッドですでにだ場合は、ディスパッチャを使用してUIスレッド上でコードのそのビットを起動する必要があり、例えば、

await Dispatcher.RunAsync(
    CoreDispatcherPriority.Normal, 
    () => progressring.Visibility = Visibility.Visible); 

あなたが好きな場合は(あなたは、そのあなたのDoWorkイベントハンドラ内からあまりにも行うことができます。 )


完全な例として、コードビハインドで

<Page 
    x:Class="UWP.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
     <ProgressRing 
      x:Name="progressRing" 
      Height="30" 
      IsActive="False" 
      Visibility="Collapsed" 
      VerticalAlignment="Top" 
      HorizontalAlignment="Left" /> 
     <Button 
      Content="Go" 
      Margin="0,30" 
      VerticalAlignment="Top" 
      Click="OnGoClick" /> 
    </Grid> 
</Page> 

:XAMLで

public partial class MainPage 
{ 
    public MainPage() 
    { 
     InitializeComponent(); 
    } 

    private void OnGoClick(object sender, RoutedEventArgs e) 
    { 
     BackgroundWorker worker = new BackgroundWorker(); 
     worker.DoWork += OnDoWork; 
     worker.RunWorkerCompleted += OnRunWorkerCompleted; 
     progressRing.IsActive = true; 
     progressRing.Visibility = Visibility.Visible; 
     worker.RunWorkerAsync(); 
    } 

    private void OnDoWork(object o, DoWorkEventArgs args) 
    { 
     Task.Delay(2000).Wait(); // Pretend to work 
    } 

    private void OnRunWorkerCompleted(object o, RunWorkerCompletedEventArgs args) 
    { 
     progressRing.Visibility = Visibility.Collapsed; 
     progressRing.IsActive = false; 
    } 
} 
+0

ありがとうございます... – Archana

関連する問題