• 测试篇 控制台调用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();

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

  • 相关阅读:
    Google API 详解
    Why should I use SASS?
    Google Maps and ASP.NET
    IP摄像机
    解决母版页报错“内容控件必须是内容页中的顶级控件,或是引用母版页的嵌套母版页。”
    sass服务
    C#中操作符的重载(Time类)
    第一次面试
    单链表(C++)
    指针和引用的区别(C++)
  • 原文地址:https://www.cnblogs.com/JJBox/p/14019951.html
Copyright © 2020-2023  润新知