2017-08-17 9 views
-2

私はいくつかのThreadsのwpfプロジェクトを持っていて、またにはprogressbarTextBlockがあり、スレッドの進行状況を示しています。次のように私のコードは次のとおりです。WPFのスレッドにusercontrolを表示するには?

XAML:

<Button Command="{Binding Start}" /> //This button start the thread 

のViewModel:

private ICommand _start; 
public ICommand Start 
{ 
    get 
    { 
     if(_start == null) 
     { 
      _start = new RelayCommand(
      param => Start_Thread()); 
     } 

     return _start; 
    } 
} 

private void Start_Thread() 
{ 
     ...//Some irrelevant juedgement codes here 
     Thread t = new Thread(new ThreadStart(StartSample)); 
     t.Start(); 
} 

はSO StartSampleスレッドで、私は現在の進行状況を示すためにUsercontrolをポップアップします。

UserControlのXAML:

<UserControl 
    <TextBlock Text="{Binding Info, Source={StaticResource Resources}}" /> 
    <mui:ModernProgressRing Style="{StaticResource RotatingPlaneProgressRingStyle}" IsActive="True" /> 
</UserControl> 

SOメインスレッドが実行されている間、私はUserControlをポップアップ何をすべきか。前もって感謝します!

+0

'UserControl'sは、「ポップアップ表示」はありません。他のコンテナにさまざまな方法で表示することができます(たとえば、「Visibility」プロパティの変更、バインドされたコンテンツプロパティの設定など)。スレッドが関与していることはほとんど関係ありません。標準的なデータバインディングのプラクティスを使用している限り、WPFはクロススレッドの側面を処理します。 Stack Overflowからの良い答えが必要な場合は、質問を改善する必要があります。あなたが試したことを示す良い[mcve]を提供し、何が問題になっているかを具体的に説明してください。 –

答えて

0

UserControlのUIウィンドウに新しいウィンドウを表示の前に、の前に長時間実行される操作をバックグラウンドスレッドで開始し、操作が完了したらウィンドウを閉じます。

これを行うための推奨と最も簡単な方法は、Task Parallel Library (TPL)を使用することです:

private void Start_Thread() 
{ 
    Window win = new Window(); 
    win.Content = new YourUserControl(); 
    win.Show(); 

    Task.Factory.StartNew(() => 
    { 
     Sample_Thread(); 
    }).ContinueWith(task => 
    { 
     //this code runs back on the UI thread once the task has finished 
     win.Close(); 
    }, System.Threading.CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext()); 
} 
関連する問題