0

スレッドでウィンドウを開きたいです。私のコードでわかるように、Thread クラスを使用したいと思います。

namespace WFPThreadin {

public partial class MainWindow : Window
{
    private static Window1 win1;
    private static Window2 win2;
    Thread tid1, tid2;

    public MainWindow()
    {
        InitializeComponent();
    }

    private void gomb_Click(object sender, RoutedEventArgs e)
    {
        if (((Button)sender).Name == "button1")
        {
            tid1 = new Thread(new ThreadStart(MainWindow.winshow1));
            tid1.SetApartmentState(ApartmentState.STA);
            tid1.Start();
        }

        if (((Button)sender).Name == "button2")
        {
            tid2 = new Thread(new ThreadStart(MainWindow.winshow2));
            tid2.SetApartmentState(ApartmentState.STA);
            tid2.Start();
        }
    }

    public static void winshow1()
    {
        win1 = new Window1();
        win1.Show();
    }

    public static void winshow2()
    {
        win2 = new Window2();
        win2.Show();
    }

}}

ボタン1(またはボタン2)をクリックすると、ウィンドウ1(またはウィンドウ2)が一瞬表示されたため、うまく機能しません...私の問題を解決するための提案があれば、感謝します!

4

2 に答える 2

2

これを試して

同じ UI スレッドで実行:

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
             new Thread(() =>
            {
                Dispatcher.Invoke((Action)(() =>
                    {
                        Window2 w2 = new Window2();
                        w2.Show();
                    }));
            }).Start();

        new Thread(() =>
        {
            Dispatcher.Invoke((Action)(() =>
            {
                Window3 w3 = new Window3();
                w3.Show();
            }));
        }).Start();

 }

2 つの異なるスレッドで実行:

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {

Thread   _firstWindowThread = new Thread(new ThreadStart(CallWindow1));
        _firstWindowThread.SetApartmentState(ApartmentState.STA);
        _firstWindowThread.IsBackground = true;
        _firstWindowThread.Start();


Thread  _secondWindowThread = new Thread(new ThreadStart(CallWindow2));
        _secondWindowThread.SetApartmentState(ApartmentState.STA);
        _secondWindowThread.IsBackground = true;
        _secondWindowThread.Start();


  } 


  private void CallWindow1()
    {
        Window2 w2 = new Window2();
        w2.Show();
        System.Windows.Threading.Dispatcher.Run();
    }

    private void CallWindow2()
    {
        Window3 w3 = new Window3();
        w3.Show();
        System.Windows.Threading.Dispatcher.Run();
    }

詳細については、WPF Threading Modelをご覧ください。

于 2013-09-06T07:25:00.737 に答える