5

私はテストユニットを実行しています(そしてそれらについて学んでいます)。簡単に言うと、私のユニットは List を作成し、それを MainWindow に渡します。

私が抱えている問題はshow()、メインウィンドウでユニットメソッドが終了した後です。MainWindow を閉じるまでユニットを終了させたくない。これは私がやったことです(以下を参照)-明らかに機能せず、ここで間違った道を進んでいるように感じます。どうすればこれを適切に行うことができますか?

    [TestClass]
    public class Logging
    {
        bool continueOn = true;
        [TestMethod]
        public void ShowLogs()
        {
            ShowResults(createLogList());
        }

        private void ShowResults(List<Log> logList)
        {
            MainWindow mw = new MainWindow(logList);
            mw.Closed += mw_Closed;  
            mw.Show();

            while (continueOn)
            { }
        }

        void mw_Closed(object sender, EventArgs e)
        {
            this.continueOn = false;
        }

        private List<Log> createLogList()
        {
            List<Log> listLog = new List<Log>();
            //logic 
            return listLog;            
        }

たぶん、これをバックグラウンド ワーカー スレッドに入れて監視する必要があります。正直なところ、何時間も無駄にする前に、ガイダンスをいただければ幸いです。

4

2 に答える 2

15

WPF ウィンドウは、WPF ウィンドウ インフラストラクチャ (メッセージ ポンピング) をサポートするスレッド上で作成および表示する必要があります。

[TestMethod]
    public void TestMethod1()
    {
        MainWindow window = null;

        // The dispatcher thread
        var t = new Thread(() =>
        {
            window = new MainWindow();

            // Initiates the dispatcher thread shutdown when the window closes
            window.Closed += (s, e) => window.Dispatcher.InvokeShutdown();

            window.Show();

            // Makes the thread support message pumping
            System.Windows.Threading.Dispatcher.Run();
        });

        // Configure the thread
        t.SetApartmentState(ApartmentState.STA);
        t.Start();
        t.Join();
    }

ご了承ください:

  • ウィンドウは、新しいスレッド内に作成して表示する必要があります。
  • ThreadStart が戻る前に、ディスパッチャー (System.Windows.Threading.Dispatcher.Run()) を開始する必要があります。そうしないと、ウィンドウが表示されてすぐに終了します。
  • STA アパートメントで実行するようにスレッドを構成する必要があります。

詳細については、このリンクにアクセスしてください。

于 2012-11-14T16:18:17.363 に答える