wpf c#在单独的线程中加载用户控件

时间:2011-01-25 09:24:46

标签: c# wpf multithreading .net-4.0

当用户点击其列表中可用的其中一个可用项目(模块)时,我将使用以下代码创建所选项目的新实例(用户控件),然后将其添加到我的tabGroupArea。

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里面有usercontrols时,initializeComponent()将需要一段时间才能完成,同时应用程序将冻结,用户无法做任何事情,我尝试了不同的方式来放

object uc = Activator.CreateInstance(Type.GetType("myNamespace." + selectedItem.Parameter1Value), selectedItem);

在一个单独的线程(Backgroundworker,thread和delegate)中,所以我可以向用户显示一个loadin页面。但我无论如何都找不到。 任何帮助,将不胜感激 。 感谢。

2 个答案:

答案 0 :(得分:2)

请参阅this blog post

Catel将此方法用于PleaseWaitWindow

答案 1 :(得分: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);
        }
    }