首页 > 其他分享 >往 VisualStudio 工具箱中添加 WPF/WinForms 控件的几种方式

往 VisualStudio 工具箱中添加 WPF/WinForms 控件的几种方式

时间:2024-04-07 20:00:30浏览次数:32  
标签:控件 NET WPF VS WinForms VisualStudio 添加 工具箱

在使用 VisualStudio 开发 WPF或WinForms应用时,打开UI文件的设计界面,我们可以从工具箱的控件列表中直接拖拽控件到界面上。通过这种方式,可以清晰的展示控件库中所有可用的控件,并且非常方便的将其添加到界面中。那么我们可以通过哪些方式将WPF/WinForms控件库中的控件添加到VisualStudio的工具箱呢?本文就对此做一个简单的总结。

我们知道,.NET Core 3.0 及以上版本提供了对 WPF/WinForm 框架的支持,而VS工具箱对其 .NET Framework 和 .NET(Core) 控件的支持存在一定的差异,所以接下来以 WPF 控件库为例,分别创建名为 MyWpfControlsForFramework 和 MyWpfControlsForCore 的 WPF 用户控件库,其目标框架分别为 .NET Framework 4.8 和 .NET 6,其中都包含一个名为 Control1 的控件,编译后分别得到对应的DLL文件。

1. WPF .NET Framework 控件

.NET Framework 的控件可以通过以下几个方式添加到VS工具箱中:

1.1 手动添加

新建 WPF .NET Framework 4.8 应用项目,双击打开 MainWindow.xaml 文件,进入设计界面,展开工具箱窗口,右键添加选项卡 MyWpfControls,然后将之前生成的 MyWpfControlsForFramework.dll 拖到该选项卡下,即可完成添加,如下图:

1.2 通过 NuGet 安装

这种方式需要我们将库项目打包成 NuGet 包,并在包中添加 tools/VisualStudioToolsManifest.xml 文件,文件内容如下:

<FileList>
    <File Reference = "MyWpfControlsForFramework.dll">
        <ToolboxItems UIFramework="WPF" VSCategory="MyWpfControls">
            <Item Type="MyWpfControlsForFramework.Control1" />
        </ToolboxItems>
    </File>
</FileList>

其中,Reference 是程序集名称,VsCategory 是选项卡名称,其中的Item 表示要添加到工具箱中的控件的完全限定名称。
这样,通过NuGet包管理器安装此包时就会将控件添加到VS工具箱。该方式支持 VS 2017 15.0 及以上版本。

1.3 Visual Studio Toolbox Controls Installer (TCI)

TCI 是 VS 的一项用于向工具箱安装控件的功能,它通过搜索注册表项的方式来查找控件。有3种方式可以利用此功能,下面介绍其中一种设置 AssemblyFoldersEx 注册表项的方式:

  1. 将程序集保存到某一自定义目录下,如:C:\MyWpfAssemblies;
  2. 打开注册表编辑器,找到 HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx 项;
  3. AssemblyFoldersEx项下新建子项,名称自定义,例如MyWpfControls,修改默认值为程序集所在目录 C:\MyWpfAssemblies
  4. MyWpfControls项下新建Toolbox子项,在该子项中添加名为TabName字符串值,值为要在VS工具箱中显示的选项卡名称,例如MyWpfControls

这样,工具箱在加载时,就会检查注册表,并将控件添加到其中。
另外,如果我们更新了程序集,例如新增了控件,那么就必须更新注册表项。因为只有这样,TCI才会更新工具箱中的控件。因此,我们可以在 Toolbox 项中添加一个名为 Version 的 DWORD值,值的数据没有要求,只是为了触发这一机制。那么在更新程序集后,也同时更新 Version 的值,就可以及时的更新工具箱中的控件。最终结果如下所示:


通过这种方式不需要添加对程序集的引用,即可在VS工具箱中显示控件,支持 VS 2010 及以上版本。另外,添加程序集和注册表的步骤可以通过“安装程序”来完成。

2. WPF .NET 6 控件

.NET 6 的控件可以通过以下几个方式添加到VS工具箱中:

2.1 通过 NuGet 安装

该方式与 .NET Framework 一样,需要我们将库项目打包成 NuGet 包,并在包中添加 tools/VisualStudioToolsManifest.xml 文件,文件内容与Framework一致。当然,为了打包方便,我们可以将该文件放到项目目录下,然后在项目文件中添加如下配置:

<PropertyGroup>
  <TargetsForTfmSpecificContentInPackage>$(TargetsForTfmSpecificContentInPackage);VSToolsManifest</TargetsForTfmSpecificContentInPackage>
</PropertyGroup>

<Target Name="VSToolsManifest">
  <ItemGroup>
    <TfmSpecificPackageFile Include="tools\VisualStudioToolsManifest.xml">
      <PackagePath>tools</PackagePath>
    </TfmSpecificPackageFile>
  </ItemGroup>
</Target>

其中IncludeVisualStudioToolsManifest.xml 文件相对项目文件的路径,PackagePath 是该文件最终在 NuGet 包中的目录路径。该方式支持 VS 2017 15.0 及以上版本。

2.2 将 NuGet 包添加到 NuGet Fallback 目录

使用这种方式,我们不需要在项目中添加对包的引用,即可在VS工具箱中显示其控件。

  1. 打开 C:\Program Files (x86)\NuGet\Config 目录,新建 MyFallback.config 文件,文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <fallbackPackageFolders>
    <add key="My NuGet Fallback Folder" value="C:\MyNuGetFallbackFolder" />
  </fallbackPackageFolders>
</configuration>

其中,key 的值应避免和同目录下其他文件内的一致,value 是自定义的 Fallback 目录。

  1. 下载 nuget.exe

  2. 执行以下指令将上一种方式生成的 NuGet 包扩展到 fallback 目录:

nuget.exe add MyWpfControlsForCore.nupkg -Source C:\MyNuGetFallbackFolder -Expand

最终,在 C:\MyNuGetFallbackFolder 中会新增一个MyWpfControlsForCore目录。使用 nuget.exe 而不是简单的解压nupkg文件的原因是 nuget.exe 会生成一个 .nuget.metadata 文件,当 NuGet 恢复时需要此文件。
当使用安装程序安装此包时,建议将此扩展好的文件夹添加到安装程序中,由安装程序将其拷贝到用户机上,而不是在用户机上调用 nuget.exe。这种方式支持 VS 2019 16.7 Preview 2 及以上版本。

以上就是往 VisualStudio 工具箱中添加 WPF/WinForms 控件的几种方式,除此之外还有其他的几种方式,详情可以看参考链接。

参考

  1. https://github.com/microsoft/xaml-designer-extensibility/blob/main/documents/toolbox-population.md#toolbox-items-from-unreferenced-assemblies
  2. https://learn.microsoft.com/zh-cn/visualstudio/extensibility/creating-a-wpf-toolbox-control?view=vs-2022

标签:控件,NET,WPF,VS,WinForms,VisualStudio,添加,工具箱
From: https://www.cnblogs.com/theyangfan/p/18083038

相关文章

  • QFComponent for lazarus增加新控件TQFGridPanelComponent
    TQFGridPanelComponent控件支持在单元格绑定可视控件,运行时单元格绑定的控件会吸附到相应的单元格里。|姓名|[#][C2]单位|办公地址|备注||:-:|:-:|:-:|:-:||秋风6|[bm4]检测中心1|南山建工村1|||秋风7|检测中心2|<COMPNAME=name3>[#][c4]南山建工村2|||[c2]地址|<COMPNAME=n......
  • ASP.NET中button、linkbutton、imagebutton及hyperlink这四个控件之间的功能区别?
    原文链接:https://blog.csdn.net/weixin_45763353/article/details/118005453Button是按钮控件,具有按钮所有的属性和事件方法,在客户端被渲染为表单元素提交按钮。Linkbutton是链接按钮,用于创建超链接样式的按钮。该控件的外观与HyperLink控件相同,但其功能与Button控件一样。它......
  • WPF布局控件汇总
    1.Grid表格布局Grid为WPF中最常用的布局容器,作为View中的主要组成部分,负责框架中整体的页面布局。注意:Grid的列宽与行高可采用固定、自动、按比例三种方式定义。固定长度:值为一个确定的数字自动长度:值为Auto,实际作用就是取实际控件所需的最小值比例长度:*表示占用剩余的全......
  • AndroidStudio学习记录(4):单选按钮控件RadioButton
    用于应用二选一等多选选项的设置<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical">&l......
  • WPF开发一个可以自适应排列的Panel控件
    一.控件介绍    初看标题可能无法理解,我们看看什么是自适应排列。乍一看它有点像WrapPanel控件,都是从左至右排列,如果一行排列不下就换行继续排列,但是细看你就会发现不对,WrapPanel控件行尾是不会对齐的,也就是说只要WrapPanel的子控件的宽度不一致,每一行的末尾就会必定留下一......
  • DevExpress WinForms中文教程 - 如何通过UI测试自动化增强应用可靠性?(一)
    DevExpressWinForm拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。DevExpressWinForm能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!UI自动化测试利用特定的工具/框架来模拟用户与界面的......
  • AndroidStudio学习记录(3):操纵按钮控件Botton、ImageBotton
    按钮控件是平时看到的,常用Botton和ImageButton控件,一般操纵按钮来实现相应的命令,比如在手机上的查找登录注册,以及点击命令等等。ImaBotton与Button的区别在于它没有文本,只有图片,需要制定图片路径在activity_main.xml文件中,它们是这样使用的:<?xmlversion="1.0"encoding=......
  • 【Qt】:常用控件(五:显示类控件)
    常用控件一.ProgressBar二.CalendarWidget一.ProgressBar使⽤QProgressBar表⽰⼀个进度条代码⽰例:设置进度条按时间增⻓设置定时器,每个0.1秒,让进度条+1在实际开发中,进度条的取值,往往是根据当前任务的实际进度来进行设置的。比如需要读取一个很大的文......
  • 【Qt】:常用控件(四:显示类控件)
    常用控件一.Lable二.LCDNumber一.LableQLabel可以⽤来显⽰⽂本和图⽚.代码⽰例:显⽰不同格式的⽂本代码⽰例:显⽰图⽚此时,如果拖动窗⼝⼤⼩,可以看到图⽚并不会随着窗⼝⼤⼩的改变⽽同步变化为了解决这个问题,可以在Widget中重写resizeEvent函数。......
  • 第三单元学校里所讲控件
    第三单元学校里所讲控件1.ImageView图片考点1:src和backgroundbackground是背景图片当设置长宽matchparentbackground会铺满而src不会,他会按原图的比例<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android&qu......