• 单独的线程上创建和显示WPF窗口


    private void NewWindowHandler(object sender, RoutedEventArgs e)
    {       
        Thread newWindowThread = new Thread(new ThreadStart(ThreadStartingPoint));
        newWindowThread.SetApartmentState(ApartmentState.STA);
        newWindowThread.IsBackground = true;
        newWindowThread.Start();
    }
    
    private void ThreadStartingPoint()
    {
        Window1 tempWindow = new Window1();
        tempWindow.Show();       
        System.Windows.Threading.Dispatcher.Run();
    }
    

    编辑: 这是一个旧的答案,但是由于它似乎经常被访问,因此我还可以想到以下修改/改进(未经测试).

    如果您想关闭这样的窗口,只需从线程外部(委托)保留对Window对象的引用,然后在其上调用close,如下所示:

    void CloseWindowSafe(Window w)
    {
        if (w.Dispatcher.CheckAccess())
            w.Close();
        else
            w.Dispatcher.Invoke(DispatcherPriority.Normal, new ThreadStart(w.Close));
    }
    
    // ...
    CloseWindowSafe(tempWindow);
    

    如果新线程可能被终止(强制中止),则符合注释中的问题:

    private void ThreadStartingPoint()
    {
        try{
            Window1 tempWindow = new Window1();
            tempWindow.Show();       
            System.Windows.Threading.Dispatcher.Run();
        }
        catch(ThreadAbortException)
        {
            tempWindow.Close();
            System.Windows.Threading.Dispatcher.InvokeShutdown();
        }
        //the CLR will "rethrow" thread abort exception automatically
    }
    

    中止线程(几乎总是)是违反最佳实践的.应该通过各种同步技术中的任何一种来优雅地处理线程,或者在这种情况下,只需通过调用的window.Close()

  • 相关阅读:
    随机生成三十个二年级的加减乘除法的题目代码
    学习进度表_四周
    返回一个整数数组中最大子数组的和1
    学习进度表_三周
    四则运算4
    构建之法读书笔记2
    学习进度表_二周
    四则运算3
    四则运算2
    单元测试
  • 原文地址:https://www.cnblogs.com/xietianjiao/p/14978893.html
Copyright © 2020-2023  润新知