Запустите SurfaceWindow и WPF-Window в той же теме - PullRequest
0 голосов
/ 16 июня 2011

У меня проблема с многопоточностью - я работаю над фреймворком, который включает в себя два окна: окно серфинга и обычное окно wpfwindow.

В моем первом тесте было автоматически запущено SurfaceWindow, из-за моего выбора проекта visualstudio и в конструкторе моего Surface Window я запустил графический интерфейс. Один поток для обеих Windows -> без проблем;)

Знайте, что мне нужно изменить порядок, моя отправная точка - общий класс .cs, и у меня возникают трудности с многопоточностью ... Для меня идеальным решением было бы запустить сначала SurfaceWindow и второе WPF-окно, но в та же тема.

Но я не хочу, чтобы WPF-окно запускалось в Contructor SurfaceWindow, но тот же эффект!

Код, вызывающий проблемы с потоками: (Вызывающий поток не может получить доступ к этому объекту, поскольку объект принадлежит другому потоку.)

 public Constructor()
    {

        Thread t = new Thread(new ThreadStart(StartSurfaceWIndowThread));
        t.SetApartmentState(ApartmentState.STA);
        t.Start();

        startWindow();

    }

    private void StartNewStaThread() {

        AdaptivePrototype.App app = new AdaptivePrototype.App();
        app.InitializeComponent();
        app.Run();

    }

    private void startWindow()
    {
            Thread thread = new Thread(() =>
            {
                WPFkGui w = new WPFGui(this);
                w.Show();

                System.Windows.Threading.Dispatcher.Run();
            });

            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();

    }

Теперь код, который был бы идеальным решением, но он не показывает WPFGUI:

 public Constructor()
    {

        Thread t = new Thread(new ThreadStart(StartSurfaceWIndowThread));
        t.SetApartmentState(ApartmentState.STA);
        t.Start();

        startWindow();

    }

    private void StartNewStaThread() {

        AdaptivePrototype.App app = new AdaptivePrototype.App();
        app.InitializeComponent();
        app.Run();
    WPFkGui w = new WPFGui(this);
        w.Show();

    }

Я был бы рад любой помощи! Спасибо, Chris

1 Ответ

1 голос
/ 17 июня 2011

Я понимаю, что вы хотите, чтобы при запуске отображалось 2 окна, и они могли взаимодействовать друг с другом.Никакой причудливый код потоков не требуется.

Откройте файл App.xaml.Там есть атрибут для «StartupUri».Удалите это - это по сути ярлык для указания WPF показывать конкретное окно при запуске приложения ... вы можете пропустить это и кодировать в своем собственном поведении при запуске.Для этого откройте App.xaml.cs и вставьте что-то вроде:

        Window1 window1 = new Window1();
        Window2 window2 = new Window2(window1);

        window1.Show();
        window2.Show();

Это, конечно, предполагает, что ваши классы окон называются Window1 и Window2 и что вы добавили конструктор в Window2это берет экземпляр Window1.

...