使用新的WPF XAML设计器编写自定义控件

目录

介绍

背景

使用代码

CustomControlLibrary.WpfCore

MyButton

VisualStudioToolsManifest

CustomControlLibrary.WpfCore.DesignTools


介绍

使用新的WPF XAML设计器在.NET7 (Core)中使用基于.designtools.dll扩展的新的WPF .NET Framework控件可扩展性模型制作自定义按钮的简化示例。通过此示例,我想简化Microsoft提供的示例,并在有人想要基于 .designtools.dll 创建自定义控件扩展性模型时仅关注主要内容。

背景

Visual Studio 2022起,基于.design.dllWPF .NET Framework控件扩展性模型不再受支持并且Microsoft.Windows.Design.Extensibility不再受支持。可以在New WPF XAML Designer for .NET Framework或XAML 设计器扩展性迁移中阅读有关它的详细信息。本文主要是从已经提到的示例和文章中复制/粘贴Microsoft。为了尽量坚持保持简单”原则,我不会从Microsoft复制粘贴更多信息。

使用代码

此示例是使用Visual Studio 2022制作的。它在以前版本的Visual Studio中不起作用,并且需要一个类库(.NET Framework)项目和一个WPF自定义控件库:

  1. CustomControlLibrary.WpfCore——WPF自定义控件库
  2. CustomControlLibrary.WpfCore.DesignTools——请注意扩展名。DesignTools是必需的,并且该项目位于.NET Framework 4.8中。稍后将复制此DLL到设计子文件夹中。
  3. 从CustomControlLibrary.WpfCore(鼠标右键->包)重建和创建包。
  4. 最后,NuGet数据包应安装在主机应用程序中,以便查看结果:

并填充工具箱

若要测试结果,还可以使用 CustomControlLibrary.WpfCore.Host 应用程序。*.DesignTools.dll文件应该像主应用程序一样位于同一文件夹中,或者像我的情况一样,位于同一个设计子文件夹中,就像Microsoft这里解释的那样。这意味着在主文件夹中,我有CustomControlLibrary.WpfCore.dllDesign子文件夹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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值