2011-01-25 24 views
0

ユーザーが自分のリストで使用可能なアイテム(モジュール)の1つをクリックすると、次のコードを使用して選択したアイテム(ユーザーコントロール)の新しいインスタンスを作成し、私のtabGroupArea。wpf c#ユーザーコントロールを別のスレッドにロード

object uc = Activator.CreateInstance(Type.GetType("myNamespace." + selectedItem.Parameter1Value), selectedItem); 
Infragistics.Windows.DockManager.ContentPane contentPane = new Infragistics.Windows.DockManager.ContentPane(); 
contentPane.Content = uc; 
tabGroupArea.Items.Add(contentPane); 

私が持っている問題はのSelectedItemは、その内部のInitializeComponentをユーザーコントロールを持っている場合()アプリケーションがフリーズすると、ユーザーは任意のことを行うことができない一方で完了するまでにしばらく時間がかかるだろうが、私は

を置くためにさまざまな方法を試してみました
object uc = Activator.CreateInstance(Type.GetType("myNamespace." + selectedItem.Parameter1Value), selectedItem); 

別のスレッド(Backgroundworker、スレッド、デリゲート)で、私はユーザーにloadinページを表示することができます。しかし、私はそれを行うためにとにかく見つけることができませんでした。 ご協力いただければ幸いです。ありがとう。

答えて

2

this blog postを参照してください。

CatelはPleaseWaitWindowにこのアプローチを使用します。

+0

こんにちはGeertさん、ありがとうございます、私のオブジェクトを作成する代理人とあなたのPleaseWaitWindowを使用する方法のサンプルがあります。デリゲートを作成してxで置き換える必要があります:Catel.Windows.PleaseWaitHelper.Show(X()=> Thread.Sleep(2000));しかし、私はエラーが発生しています。 – Asha

+0

Thread.Sleep(2000)がその例です。また、次のようなデリゲートを渡すこともできます。 public void MyMethodToExecute() { Thread.Sleep(); } public void OnCommandExecuted() { PleaseWaitHelper.Show(MyMethodToExecute); } –

0

以下のコードは、それをしない:

public partial class Window1 : Window 
    { 
     public delegate void CreateCanvasHandler(Grid parent, int index); 

     public Window1() 
     { 
      InitializeComponent(); 

      int count = 10000; 

      this.TestCreateAsync(count); 
     } 

     private void TestCreateAsync(int count) 
     { 
      for (int i = 0; i < count; i++) 
      { 
       //check the DispatecherOperation status 
       this.LayoutRoot.Dispatcher.BeginInvoke(new CreateCanvasHandler(this.CreateCanvas), 
        DispatcherPriority.Background, 
        new object[2] 
        { 
         this.LayoutRoot, 
         i 
        }); 
      } 
     } 

     private void CreateCanvas(Grid parent, 
      int index) 
     { 
      Canvas canvas = new Canvas() 
      { 
       Width = 200, 
       Height = 100 
      }; 

      canvas.Children.Add(new TextBlock() 
      { 
       Text = index.ToString(), 
       FontSize = 14, 
       Foreground = Brushes.Black 
      }); 

      Thread.Sleep(100); 

      parent.Children.Add(canvas); 
     } 
    } 
関連する問題