You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Visual Studio 2017中如何在非无边框窗体放置UserControl时弹窗提示

实现UserControl设计时的原生提示框

当然可以做到!而且能实现和VS设计视图里属性输入错误完全一致的原生提示效果,比单纯用MsgBox更贴合IDE的交互逻辑。我给你详细说下实现步骤:

核心思路

要实现这个需求,关键要做到两点:

  • 只在设计模式下触发检查(避免运行时干扰)
  • 用VS设计时的原生异常机制来弹出提示,而不是自定义消息框

具体实现代码

首先,在你的UserControl类里重写OnParentChanged方法(这个事件会在控件被添加到窗体时触发),然后加入以下逻辑:

using System;
using System.ComponentModel;
using System.Windows.Forms;

public class MyBorderlessDependentControl : UserControl
{
    protected override void OnParentChanged(EventArgs e)
    {
        base.OnParentChanged(e);

        // 仅在设计模式下执行检查
        if (LicenseManager.UsageMode == LicenseUsageMode.Designtime && Parent is Form parentForm)
        {
            // 判断父窗体是否为无边框样式
            if (parentForm.FormBorderStyle != FormBorderStyle.None)
            {
                // 抛出设计时异常,VS会自动弹出原生错误提示框
                throw new InvalidDesignerOperationException("该控件仅支持放置在无边框窗体(FormBorderStyle.None)中!");
            }
        }
    }
}

为什么不用构造函数里的MsgBox?

你之前在Public Sub New里加MsgBox的方式虽然能弹出提示,但有两个问题:

  1. 构造函数在运行时也会执行,会导致程序运行时也弹出不必要的消息
  2. 普通MsgBox的样式和VS设计时的原生提示不一致,体验不够统一

而上面的方法:

  • 通过LicenseManager.UsageMode准确判断设计模式,只在拖控件到窗体时触发
  • 抛出InvalidDesignerOperationException会让VS弹出和属性输入错误完全一样的原生提示框,甚至会阻止不符合要求的控件被添加到窗体上,更专业

可选:只提示不阻止添加

如果你不想阻止控件添加,只是想给开发者一个警告提示,可以替换抛出异常的代码为:

// 获取设计时服务,弹出原生警告框
var designerHost = (IDesignerHost)GetService(typeof(IDesignerHost));
if (designerHost != null)
{
    MessageBox.Show(this, "警告:该控件仅建议放置在无边框窗体中!", "设计时提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}

内容的提问来源于stack exchange,提问作者Simos Sigma

火山引擎 最新活动