0

Delphi 的VCL 有一个非常有用的类,CustomControl。该类是Control的直接基类,相当于C#WF的UserControl。

对于不熟悉 VCL 的人来说,CustomControl 与 Control 差别不大;主要区别在于大部分财产都受到保护;在实现新控件时,开发人员可以决定要发布哪些控件,哪些应保持隐藏。

我正在为 Windows 窗体开发自己的控件,并且我想隐藏一些属性和事件。例如,我不想公开 MouseDown 事件——相反,我允许捕获对控件元素的单击。

Windows 窗体中是否有等效于 VCL 的 CustomControl?如果没有,我如何在我的控件中隐藏不需要的公共属性和事件?


回应答案:

这不是安全问题,而是代码优雅问题。在 Delphi 中,我可以从 CustomControl 派生,保留 OnMouseDown 事件受保护(如在 C# 中受保护),然后对控件的用户说:

您不能使用 OnMouseDown,因为没有。如果您想对用户单击控件做出反应,只需使用 OnElementClicked - 您甚至可以获得有关单击了哪个元素及其状态的详细信息。

我可以按照 Hans Passant 的建议禁用调用 MouseDown 事件,但是我必须在控件的用户手册中包含以下内容:

不要使用 MouseDown 事件,因为我已经覆盖了 OnMouseDown 方法,因此它不会调用 MouseDown 事件。这是因为控件的逻辑是这样设计的,您应该使用 OnElementClicked 而不是 OnMouseDown。请不要因为 MouseDown 不起作用而批评控件。请不要将其报告为错误,因为它是设计使然。请不要在论坛上发布消息或创建博客条目来解释如何通过继承类并手动调用 MouseDown 事件来解决 MouseDown 问题,因为它会破坏控件的逻辑。请不要……该死的,告诉过你!

如果有人真的继承了我的控制权——我假设他知道他在做什么(也因为一个人也可以访问我的控制权的内部逻辑)。但如果有人只是使用我的控件,我只会给他这些属性、事件和方法,我确信它们会按设计工作。

我希望它能解释我的动机:)

4

1 回答 1

0

我认为 Delphi 所做的隐藏,你所要求的,和使它不可访问之间有一个根本的区别。隐藏很简单,只需重复声明并应用属性即可:

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

class MyControl : Control {
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
    private new event MouseEventHandler MouseDown;
}

这会阻止事件显示在“属性”窗口中,它不会显示在 IntelliSense 下拉列表中,并且当他尝试在代码中分配事件时会生成编译错误。

然而,不能绝对保证客户端程序员无论如何都无法绕过限制。例如,通过强制转换或覆盖您的类。但最终的后门是实现 IMessageFilter 接口,对此你无能为力。因此,如果以优雅为目标,这应该已经足够好了。

于 2012-11-28T14:22:18.953 回答