
WPF的MainWindow的代码
using System;
using SystemCollectionsGeneric;
using SystemLinq;
using SystemText;
using SystemWindows;
using SystemWindowsControls;
using SystemWindowsData;
using SystemWindowsDocuments;
using SystemWindowsInput;
using SystemWindowsMedia;
using SystemWindowsMediaImaging;
using SystemWindowsNavigation;
using SystemWindowsShapes;
namespace WpfApplication2
{
/// <summary>
/// MainWindowxaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
UserControl1 us = new UserControl1();
thisgridChildrenAdd(usaddTextBox()); // 在前台的Grid里 添加Name属性,才可以使用 thisgrid例如<Grid Name="grid">
}
}
}
winform的userControl的代码
using SystemCollectionsGeneric;
using SystemComponentModel;
using SystemDrawing;
using SystemData;
using SystemLinq;
using SystemText;
using SystemWindowsForms;
using SystemWindowsControls;
namespace WpfApplication2
{
public partial class UserControl1 : SystemWindowsControlsControl
{
public UserControl1()
{
InitializeComponent();
}
private void UserControl1_Load(object sender, EventArgs e)
{
addTextBox();
}
public SystemWindowsControlsTextBox addTextBox()
{
SystemWindowsControlsTextBox tx = new SystemWindowsControlsTextBox();
txText = "111";
return tx;
}
}
}
UserControl1Designercs 这个不改的话,你执行下,报错的地方删掉
namespace WpfApplication2
{
partial class UserControl1
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private SystemComponentModelIContainer components = null;
#region 组件设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
}
#endregion
}
}
因为WPF和WINFORM的控件类型是不一样的,一个是controls里的,一个是forms里的,你在WPF里添加 的话,类型不同,参数不能转换
其实我这样用,已经用的不是WINFORM的控件了,相当于自己建个类,写个创建控件的方法而已
一 介绍
本文将以一个实例来说明如何将WPF技术集成在基于MFC的应用程序中 这种技术的主要目的是为了增强基于Win /MFC的应用程序的在图形方面的表现能力 本文所提供的演示程序将在MFC对话框架应用程序中显示一个WPF动画时钟 界面如图 所示
本文需要的开发工具和开发库 为了建立和运行demo程序 我们需要安装如下的组件
Visual Studio 或Visual Studio NET Framework 或 NET Framework
所需要的平台 demo程序必须在下面支持 NET Framework 的 *** 作系统平台上运行
Windows Vista Windows XP SP Windows Server SP
如果你是一名C++开发人员 并且想使用WPF技术来增强自己的基于Win /MFC应用程序 本文非常适合你 为了能从本文学习到更多的知识 我们需要熟悉VC++/CLi MFC XAML和C# 但是 如果我们不了解C#或XAML 我们仍然可以通过引用现成的DLL来使用WPF程序
二 什么是WPF
WPF是Windows Presentation Foundation的缩写 它是微软 NET Framework 的一个子系统 这种技术允许开发人员高效地创建可视化的应用程序 并改善用户体验 由于WPF的发布 使用Windows程序在富控件的设计 开发上更如虎添翼 WPF主要关注一套应用程序服务 用户接口 D和 D 矢量图 动画 数据绑字 音频 并提供一个在UI和商业逻辑之间的非常清晰的界限
WPF API是被管制的代码 但是大多数Win /MFC程序是非管制的C++代码 按著惯例 WPF API不能通过非常制程序调用 然后 通过使用VC编译器的/clr选项 我们可以建立一个由管制和非管制混合而面的系统 在这个系统中 我们可以使管制和非管制代码无缝地混合在一起
有一个要注意的是在C++工程中不允许编译XAML文件 因此 我们必须建立一个包含在本例中所需要的所有XAML而的C# DLL 然后在C++工程中包含这个Dll引用
有两种基本的技术可以融合WPF和Win /MFC代码
将WPF放到Win /MFC程序中 使用这种技术 开发人员可以使用WPF的高级图形能力来渲染Win /MFC应用程序
将Win /MFC放到WPF中 使用这种技术 开发人员可以在WPF中使用已经存在的
Win /MFC控件 并通过一定的机制来传递数据
在本文中将采用第一种方法
三 融合Win /MFC和WPF程序
上面部分所说的是本例的基本规则 下面在本节中将介绍如何编写具体的实现代码 在本例中 我首先会演示使用XAML和C#建立WPF内容 并在VC++中引用这个DLL
本例的目的是建立一个用于设置日期和时间的设置工具 其中动画部分使用WPF实现 程序的其他部分仍然使用MFC实现
这个演示程序由两部分组成 一个是MFCHostMPF(由VC++/MFC代码组成) 另一个是WPFControls(由XAML和C#代码组成) 这个MFCHostWPF工程将由WPFControls工程所产生的DLL作为一个外部的引用 如图 所示
向MFC工程中加入一个WPF引用 如图 和图 所示
三 在MFC应用程序中加入和WPF相关的代码
先提一下 gcnew关键字被用于建立一个管制类型的实例 在本例中将建立一个垃圾回收集合栈的实例 所有被gcnew分配的内存空间将被垃圾回收器自动管理 而开发人员并不需要为什么时间释放它们而 *** 心
为了使用WPF程序 关键是System::Windows::Interop::HwndSource类 这个类将在Win 窗口中使用WPF程序 因此 WPF程序可以作为MFC窗口的子窗口放到UI上 而在WPF对象和Win 窗口之间的通讯要通过引用C++程序中被存储的静态字段 这些静态字段的代码如下
ref class Globals { public: static System::Windows::Interop::HwndSource^ gHwndSource; static WPFControls::AnimClock^ gwcClock; };
HWND hwndWPF; // 和WPF相关的hwnd 为了建立一个HwndSource 首先需要建立一个HwndSourceParameters结构 这个结构需要如下的参数 类 窗口 窗口类型 窗口的初始位置 窗口的初始尺寸 父窗口 一但我们将HwndSourceParameters结构编写完 就可以将这个结构到HwndSource的构造方法HwndSource(HwndSourceParameters)中 最后 我们将WPF时钟的引用赋值给HwndSource对象的RootVisual属性 并通过调用Handle ToPointer()返回HwndSource的HWND 代码如下HWND GetHwnd(HWND parent int x int y int width int height) { System::Windows::Interop::HwndSourceParameters^ sourceParams = gcnew System::Windows::Interop::HwndSourceParameters ( MFCWPFApp ); sourceParams >PositionX = x; sourceParams >PositionY = y; sourceParams >Height = height; sourceParams >Width = width; sourceParams >ParentWindow = IntPtr(parent); sourceParams >WindowStyle = WS_VISIBLE | WS_CHILD; Globals::gHwndSource = gcnew System::Windows::Interop::HwndSource(sourceParams); DateTime tm = DateTime::Now; Globals::gwcClock = gcnew WPFControls::AnimClock(); Globals::gwcClock >ChangeDateTime(tm Year tm Month tm Day tm Hour tm Minute tm Second); FrameworkElement^ myPage = Globals::gwcClock; Globals::gHwndSource >RootVisual = myPage; return (HWND) Globals::gHwndSource >Handle ToPointer(); }
因此 无论用户如何变化时钟 我们的MFC代码都会调用RefereshWPFControl()来刷新WPF时钟void RefreshWPFControl() { FrameworkElement^ page; DateTime tm = DateTime::Now; Globals::gwcClock >ChangeDateTime(tm Year tm Month tm Day tm Hour tm Minute tm Second); page = Globals::gwcClock; Globals::gHwndSource >RootVisual = page; return; }
现在我们已经有了大部分我们需要的功能了 而最后的任务是在MFC对话框代码中找个地方调用HwndSource实现创建函数 当然 有很多地方可以做这个工作 但是OnCreate也许是最好的位置 在OnCreate事件句柄中调用GetHwnd()函数的代码如下int CMFCHostWPFDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialog::OnCreate(lpCreateStruct) == ) return ; hwndWPF = GetHwnd(this >GetSafeHwnd() ); return ; }
四 结论 lishixinzhi/Article/program/net/201311/11996
右键项目选择 管理NuGet包:
接下来安装SQLiteCore
遇到的问题,主要是打包安装后会出现。问题的原因其实是一致的。如果你捕获了全局异常,就能从异常信息中得到错误原因。
这个是因为从NuGet获得的包内是没有 SQLiteInteropdll 的,但是在Debug的时候,它会自动生成对应平台的dll。可以看一下项目目录下( /packages/SystemDataSQLite/build )
里面有各个 NET 版本的对应平台的 SQLiteInteropdll 。打包的时候,将对应的文件一起打包即可。如果要兼顾 x86 和 x64 ,也可以在打包时指定在应用文件夹,创建 x86 和 x64 目录,并将对应的 SQLiteInteropdll 放进去。这也是最保险的方法。
以管理员权限运行即可。
wpf生成dump具体方法介绍如下:
现在我准备创建一个简单的 winform 程序,在 button 事件中故意让主线程sleep造成程序假死,参考代码如下:
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { ThreadSleep(1000 10); MessageBoxShow("clicked me!"); } }

接下来启动 cmd 窗口,输入:
C:\Windows\system32>procdump -ma -h -w WindowsFormsApp1exe E:\net5\hungwindowdmp ProcDump v100 - Sysinternals process dump utility Copyright (C) 2009-2020 Mark Russinovich and Andrew Richards Sysinternals - >
我有一个用户控件,用户控件被动态加载到主窗体(frm_Manage)里。我想当用户控件被点击后就清空主窗体里Grid 控件里的所有子控件。private void lbl_MenuName_MouseLeftButtonDown(object sender,MouseButtonEventArgs e){//frm_Manage 为主窗体,Grid_MenuChildren 为主窗体的一个控件var frm = (thisParent as frm_Manage);frmGrid_MenuChildrenChildrenClear();}上面这样写的话会报错:frm 为null。------解决方案--------------------------------------------------------使用事件。主窗口响应事件,把值传给控件。------解决方案--------------------------------------------------------呃,你把UserControl 放MainWindow 里不就结了。WPF 的话更建议用数据驱动的思想设计程序。------解决方案--------------------------------------------------------响应事件的方法比较简单。用户控件定义好了,在主窗体里完全可以把用户控件当作一个按钮来用。// #用户控件// 定义public event EventHandler click;// 被点击时,传递点击事件给外部if (null != click) click(null, null);// #主窗体// 用户控件的点击事件userControlclick += (us, ue) = { MessageBoxShow( 用户控件被点击 ); };------解决方案--------------------------------------------------------实在不行你就给usercontrol 写个SetParent 的方法 初始化的时候调用下 把父窗口传递进去 然后用就是了这样基本上可以解决你的问题 但是不是推荐的做法
以上就是关于wpf中调用winform用户控件的方法全部的内容,包括:wpf中调用winform用户控件的方法、在MFC中使用WPF技术、在WPF中使用SQLite等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)