wpf c # загрузить пользовательский элемент управления в отдельном потоке - PullRequest
0 голосов
/ 25 января 2011

когда пользователь нажимает на один из доступных элементов (модулей), доступных в его списке, я буду использовать следующий код для создания нового экземпляра выбранного элемента (пользовательский элемент управления), а затем добавлю его в мою 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 имеет пользовательские элементы управления внутри. InitializeComponent () займет некоторое время, пока приложение будет зависать, а пользователь не сможет ничего сделать, я пробовал разные способы поставить

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

в отдельном потоке (Backgroundworker, thread и делегат), чтобы я мог показать пользователю страницу загрузки. Но я все равно не смог найти этого. любая помощь будет оценена. спасибо.

Ответы [ 2 ]

2 голосов
/ 25 января 2011

См. это сообщение в блоге .

Catel использует этот подход для PleaseWaitWindow .

0 голосов
/ 25 января 2011

код ниже делает это:

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);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...