目录
CustomControlLibrary.WpfCore.DesignTools
介绍
使用新的WPF XAML设计器在.NET7 (Core)中使用基于.designtools.dll扩展的新的WPF .NET Framework控件可扩展性模型制作自定义按钮的简化示例。通过此示例,我想简化Microsoft提供的示例,并在有人想要基于 .designtools.dll 创建自定义控件扩展性模型时仅关注主要内容。
背景
自Visual Studio 2022起,基于.design.dll的WPF .NET Framework控件扩展性模型不再受支持并且Microsoft.Windows.Design.Extensibility不再受支持。可以在New WPF XAML Designer for .NET Framework或XAML 设计器扩展性迁移中阅读有关它的详细信息。本文主要是从已经提到的示例和文章中复制/粘贴Microsoft。为了尽量坚持“保持简单”原则,我不会从Microsoft复制粘贴更多信息。
使用代码
此示例是使用Visual Studio 2022制作的。它在以前版本的Visual Studio中不起作用,并且需要一个类库(.NET Framework)项目和一个WPF自定义控件库:
- CustomControlLibrary.WpfCore——WPF自定义控件库
- CustomControlLibrary.WpfCore.DesignTools——请注意扩展名。DesignTools是必需的,并且该项目位于.NET Framework 4.8中。稍后将复制此DLL到“设计”子文件夹中。
- 从CustomControlLibrary.WpfCore(鼠标右键->包)重建和创建包。
- 最后,NuGet数据包应安装在主机应用程序中,以便查看结果:
并填充工具箱。
若要测试结果,还可以使用 CustomControlLibrary.WpfCore.Host 应用程序。*.DesignTools.dll文件应该像主应用程序一样位于同一文件夹中,或者像我的情况一样,位于同一个设计子文件夹中,就像Microsoft这里解释的那样。这意味着在主文件夹中,我有CustomControlLibrary.WpfCore.dll在Design子文件夹CustomControlLibrary.WpfCore.DesignTools.dll中,就像我的例子一样。
CustomControlLibrary.WpfCore
1、创建WPF自定义控件库并将csproj更改为如下所示:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWPF>true</UseWPF>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="NuGet.Build.Packaging" Version="0.2.2">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles;
analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
<PropertyGroup>
<PackageId>CustomControlLibrary.WpfCore</PackageId>
<Description>Button example</Description>
</PropertyGroup>
<ItemGroup>
<PackageFile Include="VisualStudioToolsManifest.xml">
<Kind>Tools</Kind>
</PackageFile>
<PackageFile Include=
"$(OutputPath)\CustomControlLibrary.WpfCore.DesignTools.dll">
<Kind>Lib</Kind>
<TargetPath>Design\CustomControlLibrary.WpfCore.DesignTools.dll
</TargetPath>
</PackageFile>
</ItemGroup>
</Project>
2、重命名CustomControl1为 MyButton,也在 Generic.xaml 中。
3、添加 VisualStudioToolsManifest.xml。
MyButton
using System.Windows;
using System.Windows.Controls;
namespace CustomControlLibrary.WpfCore
{
public class MyButton : Button
{
public static DependencyProperty RenderActiveProperty;
public bool RenderActive
{
get { return (bool)GetValue(RenderActiveProperty); }
set { SetValue(RenderActiveProperty, value); }
}
static MyButton()
{
RenderActiveProperty = DependencyProperty.Register("RenderActive",
typeof(bool),
typeof(MyButton),
new PropertyMetadata(false));
}
public string Test { get; set; }
}
}
VisualStudioToolsManifest
需要此文件来填充工具箱,如此处所述Microsoft。在主机应用程序中安装NuGet包后,应会看到如下所示的内容:
<FileList>
<File Reference="CustomControlLibrary.WpfCore.dll">
<ToolboxItems UIFramework="WPF" VSCategory="CustomControlLibrary.WpfCore"
BlendCategory="CustomControlLibrary.WpfCore">
<Item Type="CustomControlLibrary.WpfCore.MyButton" />
</ToolboxItems>
</File>
</FileList>
CustomControlLibrary.WpfCore.DesignTools
1、安装NuGet包Microsoft.VisualStudio.DesignTools.Extensibility:
Install-Package Microsoft.VisualStudio.DesignTools.Extensibility
-Version 17.4.33103.184
2、重命名Class1为MyDesignMetadata:
using Microsoft.VisualStudio.DesignTools.Extensibility.Metadata;
using System.ComponentModel;
[assembly: ProvideMetadata(typeof
(XAMLDesignerExtensibilityCore.DesignTools.MyDesignMetadata))]
namespace XAMLDesignerExtensibilityCore.DesignTools
{
public class MyDesignMetadata : IProvideAttributeTable
{
public AttributeTable AttributeTable
{
get
{
AttributeTableBuilder builder = new AttributeTableBuilder();
builder.AddCustomAttributes("CustomControlLibrary.WpfCore.MyButton"
, "Test"
, new CategoryAttribute("** test **")
);
return builder.CreateTable();
}
}
}
}
3、将生成输出路径设置为类似..\CustomControlLibrary.WpfCore\bin\Debug\net7.0-windows\ 或手动将其复制到 CustomControlLibrary.WpfCore 输出文件夹。
https://www.codeproject.com/Tips/5354269/Writing-Custom-Control-with-New-WPF-XAML-Designer