在Winforms .NET内核中使用命令链接

bwntbbo3  于 2022-12-30  发布在  .NET
关注(0)|答案(1)|浏览(137)

我想将命令链接添加到适用于Windows 10 21H2的C# .NET核心Windows窗体应用程序中,但我没有找到任何在线教程。
我相信这是一张命令链接的照片,但我不太确定。有人能告诉我如何将这些添加到我的应用程序中吗?

我在VS工具箱中找不到这样的控件。

fykwrbwg

fykwrbwg1#

尝试使用此自定义控件,该控件派生自Button,其中BS_COMMANDLINK样式添加到CreateParams属性重写中。
这将在CommandLink按钮中转换标准按钮控件。
控件的Text属性值显示在箭头的右侧,而自定义LinkNote属性提供的说明显示在文本的正下方,字体较小。
设置LinkNote值时,BCM_SETNOTE消息将发送到本机Button。这将在设计时或运行时设置关联的Note。
自定义ControlDesigner用于移除设置此样式时不需要/不使用的属性,或无法更改的属性,如FlatStyle(需要设置为FlatStyle.System)。
遗憾的是,此设计器只能在.NET Framework中工作,要使其在.NET 5+中工作,您需要安装Microsoft.WinForms.Designer.SDK包。打开包管理器控制台并粘贴:

NuGet\Install-Package Microsoft.WinForms.Designer.SDK -Version 1.1.0-prerelease-preview3.22076.5

否则很难找到这个包裹。
如果您不关心设计器的功能,则将其删除即可

using System.Collections;
using System.ComponentModel;
using System.Runtime.InteropServices;
#if NET5_0_OR_GREATER
    using Microsoft.DotNet.DesignTools.Designers;
#else
    using System.Windows.Forms.Design;
#endif

[ToolboxItem(true)]
[Designer(typeof(CommandLinkDesigner))]
public class CommandLink : Button {
    private const int BCM_SETNOTE = 0x1609;
    private string m_LinkNote = string.Empty;

    public CommandLink() {
        SetStyle(ControlStyles.ResizeRedraw | ControlStyles.UseTextForAccessibility, true);
        FlatStyle = FlatStyle.System;
    }

    [DefaultValue(FlatStyle.System)]
    public new FlatStyle FlatStyle {
        get { return base.FlatStyle; }
        set { base.FlatStyle = FlatStyle.System; }
    }

    public string LinkNote {
        get => m_LinkNote;
        set {
            if (value != m_LinkNote) {
                m_LinkNote = value;
                SendMessage(this.Handle, BCM_SETNOTE, 0, m_LinkNote);
            }
        }
    }

    protected override CreateParams CreateParams {
        get {
            var cp = base.CreateParams;
            cp.Style |= (0 | 0x0E); // Set BS_COMMANDLINK 
            return cp;
        }
    }

    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    private static extern bool SendMessage(IntPtr hWnd, int msg, int wParam, string lParam);

    public class CommandLinkDesigner : ControlDesigner {
        private readonly string[] RemovedProperties = new[] {
            "AllowDrop", "AutoEllipsis", "AutoSize", "AutoSizeMode",
            "BackColor", "BackgroundImage", "BackgroundImageLayout",
            "Cursor", "FlatAppearance", "FlatStyle",
            "ForeColor", "Image", "ImageAlign", "ImageImdex", "ImageKey",
            "ImageList", "TextAlign", "TextImageRelation"
        };

        public CommandLinkDesigner() { }

        protected override void PreFilterProperties(IDictionary properties)
        {
            foreach (string prop in RemovedProperties) {
                properties.Remove(prop);
            }
            base.PreFilterProperties(properties);
        }
    }
}

相关问题