今天,
我想用控制台调用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(); } } }
然后新建一个.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>
然后控制台工程引用这个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();
这里面的一系列操作都涉及线程操作....没仔细研究过....嘿嘿....