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

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 如何实现从tello无人机上获取实时传输的视频流,然后将获取的视频通过yolov5进行检测
  • ¥15 WPF使用Canvas绘制矢量图问题
  • ¥15 用三极管设计一个单管共射放大电路
  • ¥15 孟德尔随机化r语言运行问题
  • ¥15 pyinstaller编译的时候出现No module named 'imp'
  • ¥15 nirs_kit中打码怎么看(打码文件是csv格式)
  • ¥15 怎么把多于硬盘空间放到根目录下
  • ¥15 Matlab问题解答有两个问题
  • ¥15 LCD12864中文显示
  • ¥15 在使用CH341SER.EXE时不小心把所有驱动文件删除了怎么解决