如何在WPF中嵌入Winform控件

如何在WPF中嵌入Winform控件,第1张

1. 新建一个基于.Net Framework 3.5 的WPF 应用程序项目:WPFWMP。

2. 在工程中新建Windows Forms Control Library 项目:WMPControlLibrary。

创建WMP 控件

下面要在WMPControlLibrary 中创建Windows Media Player 控件,在项目中加入Windows Media Player COM。

在左侧工具栏中若没有Windows Media Player 控件的话,可以右键General 选择Choose Items,在COM 组件列表中勾选Windows Media Player 选项。

将Windows Media Player 控件拖入设计窗口,并将Dock 设置为Fill 填充控件。

F6 编译项目后会生成以下三个DLL 文件,这就是我们稍后将要在WPF 中用到的WMP 控件库。

嵌入WMP 控件

回到WPF 项目在前篇文章的基础上,保留其中“Open File” 按键和Button 样式。将上面三个DLL 文件及System.Windows.Forms、WindowsFormsIntegration 加入项目。

在XAML 中加入AxWMPLib 命名空间,并将上篇MediaElement 替换为AxWindowsMediaPlayer 控件,注意此处是将WinForm 控件嵌入WPF 程序,所以要将AxWindowsMediaPlayer 控件放到<WindowsFormsHost>标签中。

在WinForm中,我们要跨线程访问窗口控件,只需要设置属性CheckForIllegalCrossThreadCalls = false即可。

在WPF中要麻烦一下,同样的不允许跨线程访问,因为没有权限,访问了会抛异常;

没有CheckForIllegalCrossThreadCalls 属性,可以

在WPF中的窗口控件都有一个Dispatcher属性,允许访问控件的线程;既然不允许直接访问,就告诉控件我们要干什么就好了。

方法如下:

private delegate void outputDelegate(string msg)

private void output(string msg)

{

this.txtMessage.Dispatcher.Invoke(new outputDelegate(outputAction), msg)

}

private void outputAction(string msg)

{

this.txtMessage.AppendText(msg)

this.txtMessage.AppendText("\n")

}

这里是要 输出一段字符串在TextBox中,只需要调用output方法就可以了。

B既然是个窗体,那就必须实例化,就是通过new来创建。但B窗体应该是已经显示出来了,所以应该把B窗体的实例直接传给A窗体。

从你的描述分析,我认为B是主窗体,A是后出来的,这样B在调用A.Show或者A.ShowDialog是可以再括号里加上this作为参数,那么在A里直接使用this.parent就可以取到B的实例了。

直接调用B.add()并不是没有反应,而是你添加了控件,但没有添加到你看到的那个B上,而是A自己作成的B。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11615054.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存