测试篇 控制台调用winform调用wpf

今天,

我想用控制台调用winform调用wpf

主要是之前嵌入窗体的项目,在cad08嵌入wpf的时候有点问题......导致了我很多后续工作都没法干.....

然后今天就实验了一下...

参考了这个地方:  https://blog.csdn.net/bruce135lee/article/details/81132310

首先新建一个.net framework控制台工程,然后加个winform窗体,然后启动...测试ok.

如果不ok也要在Main()上面加[STAThread]

namespace ConsoleApp1
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        { 
            new Thread(() =>
            {
                while (true)
                {
                    var str = Console.ReadLine();
                    if (int.TryParse(str, out int ww))
                    {
                        //ff.Width = ww;
                    }
                }
            }).Start();

            var ff = new DocsFormTest();
            ff.ShowDialog();
        }
    }
}
View Code

  

然后新建一个.net framework wpf项目,在项目的一个Xmal写一个TextBox.

<Window x:Class="WpfApp1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="Window1" Height="450" Width="800" 
        WindowStyle="None"
        Background="Azure">
    
    <Grid> 
        <TextBox Margin="212,194.5,267,179.5" Background="Beige"/>
    </Grid>
</Window>
View Code

然后控制台工程引用这个wpf项目,(为了简便就引用工程吧....)

控制台工程引用为了WPF运行,引用对应的程序集:

  

再回到winform的写一个Load事件,上面调用这个wpf,这个时候如果启动,就会报错:

System.InvalidOperationException:“调用线程必须为 STA,因为许多 UI 组件都需要。”

原因是要在Load事件上面要写一个[STAThread]...  

        [STAThread]//不加的话调用不了wpf,会出现STA错误
        private void DocsFormTest_Load(object sender, EventArgs e)
        { 
            //在控制台调用了winform调用了wpf
            var wpfwindow = new WpfApp1.Window1();
            //使WPF窗体响应鼠标键盘输入
            ElementHost.EnableModelessKeyboardInterop(wpfwindow);
            //设置WPF窗体的owner,使其 WindowStartupLocation.CenterOwner窗体展示生效。
            var helper = new WindowInteropHelper(wpfwindow);
            helper.Owner = this.Handle;
            wpfwindow.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterOwner;
            wpfwindow.Show();
        }

测试2:

控制台工程直接调用wpf工程会卡死wpf....

那么  wpfwindow.Show();  要改成  wpfwindow.ShowDialog();

这里面的一系列操作都涉及线程操作....没仔细研究过....嘿嘿....

原文地址:https://www.cnblogs.com/JJBox/p/14019951.html