infinat 2013-11-11 06:04 采纳率: 0%
浏览 2216

C# Winform 在视图设计器模式下,如何响应事件?

正在设计一个容器性的用户控件(A),和一个内部控件(B)。
意图在于设计类似TreeView和TreeNode关系一样的两个个控件。

现在只能通过属性面板中,直接修改增减A的属性A.Nodes成员(Nodes属性是一个EventList,EventList是继承自List我为他添加了增加、移除的事件)。

而且A.Nodes的成员增减后,在**设计模式**下,不能即时体现,只能在调试后才能看见Nodes的成员。

另外,我想通过在视图设计器模式下,如果能实时看到A.Nodes下的所有B的话,点击其中一个,能够触发点击事件。(目前虽然在B中有关于B.click的定义,但是视图设计器模式下不能触发)。

请高手解毒:
1、如何才能在视图设计器模式下实时响应属性的变化?
2、如何才能在视图设计器模式下响应响应事件?
3、微软自己做的控件上,在设计模式下,都有一个小三角的图标,点击后,能方便的看到上边列了一些诸如“在父容器中停靠”、“增加、删除节点”等任务。通过点击,可以直接在页面上修改属性。这种方式如何实现?

  • 写回答

1条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2024-03-20 23:28
    关注

    所有内容均由人工智能模型输出,其内容的准确性和完整性无法保证,不代表我的态度或观点。
    GLM-4在2024.02.27SuperCLUE基准得分榜单中排行第四https://www.superclueai.com/


    该回答引用GLM-4,仅提供参考,不保证完全正确
    目前为GLM-4(智谱清言)专栏,网页版本:未知(更新时间未知)
    如有图像,GLM-4将尝试识别您的图像

    1. 如何才能在视图设计器模式下实时响应属性的变化?

    要在视图设计器模式下实时响应属性的变化,您需要重写控件的 OnNotifyMessage 方法。在这个方法中,您可以检查是否有关于属性变化的 WM_REFLECT + WM_PROPERTYCHANGE 消息,然后根据需要更新控件的显示。

    protected override void OnNotifyMessage(Message m)
    {
        if (m.Msg == (int)Win32.Msgs.WM_REFLECT + (int)Win32.Msgs.WM_PROPERTYCHANGE)
        {
            // 属性变化处理逻辑
            this.Refresh();
        }
        base.OnNotifyMessage(m);
    }
    

    1. 如何才能在视图设计器模式下响应事件?

    要在视图设计器模式下响应事件,您需要在控件的构造函数中添加设计时事件处理程序。例如,如果您想在设计器模式下处理 Click 事件,您可以这样做:

    public YourControl()
    {
        // 其他初始化代码
        if (LicenseManager.UsageMode == LicenseUsageMode.Designtime)
        {
            this.Click += new EventHandler(YourControl_Click);
        }
    }
    private void YourControl_Click(object sender, EventArgs e)
    {
        // 设计时点击事件处理逻辑
    }
    

    1. 微软自己做的控件上,在设计模式下,都有一个小三角的图标,点击后,能方便的看到上边列了一些诸如“在父容器中停靠”、“增加、删除节点”等任务。通过点击,可以直接在页面上修改属性。这种方式如何实现?

    要实现这种方式,您需要为您的控件添加自定义设计器。这通常涉及到继承 ComponentDesigner 类并重写一些方法,例如 InitializeOnSetComponentDefaultsGetHitTest。然后,您需要在您的控件项目中添加一个 .designer 文件,并在其中指定使用您的自定义设计器。


    这是一个简单的示例,展示了如何为您的控件添加自定义设计器:

    using System;
    using System.ComponentModel;
    using System.ComponentModel.Design;
    public class YourControlDesigner : ComponentDesigner
    {
        public override void Initialize(IComponent component)
        {
            base.Initialize(component);
            // 添加设计时行为
        }
    }
    

    然后,在您的控件项目中,创建一个名为 YourControl.Designer.cs 的文件,并在其中添加以下内容:

    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.ComponentModel.Design;
    using System.Diagnostics;
    using System.Drawing;
    using System.Windows.Forms;
    [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2210:AssembliesShouldHaveValidStrongNames")]
    namespace YourNamespace
    {
        [Designer(typeof(YourControlDesigner))]
        public partial class YourControl
        {
            // 控件代码
        }
    }
    

    这只是一个简单的示例,实际实现可能更复杂。您可能需要阅读更多关于自定义控件的文档和示例,以便更好地理解如何为您的控件添加自定义设计时行为。

    评论

报告相同问题?

悬赏问题

  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面
  • ¥50 NT4.0系统 STOP:0X0000007B
  • ¥15 想问一下stata17中这段代码哪里有问题呀
  • ¥15 flink cdc无法实时同步mysql数据
  • ¥100 有人会搭建GPT-J-6B框架吗?有偿