【问题标题】:Show WPF window from test unit从测试单元显示 WPF 窗口
【发布时间】:2014-03-24 23:00:14
【问题描述】:

我正在运行一个测试单元(并了解它们)。很简单,我的单元创建一个列表并将其传递给我的 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;            
        }

也许我必须把它放到后台工作线程上并监控它 - 老实说我不知道​​,在我浪费时间之前,我希望得到一些指导。

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    必须在支持 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 单元中运行。

    欲了解更多信息,请访问this link

    【讨论】:

      【解决方案2】:

      当然,既然只是为了测试,使用

      ShowDialog() 
      

      可能是一个选项,而不是 'Show()'

      【讨论】:

        猜你喜欢
        • 2018-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-08
        • 2011-12-06
        • 1970-01-01
        • 2021-03-08
        • 1970-01-01
        相关资源
        最近更新 更多