【问题标题】:Hiding unwanted properties in custom controls在自定义控件中隐藏不需要的属性
【发布时间】:2010-12-04 10:38:20
【问题描述】:

这是在派生控件中隐藏属性的方法吗?

public class NewButton : Button

...

[Browsable ( false )]
public new ContentAlignment TextAlign { get; set; }

这也隐藏了设计器的“属性”窗口中的属性,但我怎样才能在代码中隐藏该属性?

【问题讨论】:

    标签: c# .net winforms gdi+


    【解决方案1】:

    从代码中,您可以最接近地隐藏它,并且直接调用可能会很痛苦 - 请注意,即使隐藏它也是可调用的,并且这些都不会在强制转换后起作用:

    // about the closest you can do, but not really an answer
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
    [Obsolete("just cast me to avoid all this hiding...", true)]
    public new ContentAlignment TextAlign { get; set; }
    

    就个人而言,我不会打扰。它不健壮(只是强制转换)。

    【讨论】:

    • 谢谢马克。在这种情况下,通过强制转换是指转换为父类,Button?
    【解决方案2】:

    您可以使用[EditorBrowsable] 属性,如documented here

    [EditorBrowsable(EditorBrowsableState.Never)]
    public bool HideMeInIntellisense
    {
        // ...
    

    来自文档:

    ...Visual Studio 中的 IntelliSense 引擎使用此属性来确定是否显示属性或方法。

    但是,用户可以在 VS 设置中覆盖它。 ReSharper 还有一个设置,用于控制是否在其 IntelliSense 中支持此属性。

    出于好奇,您为什么要对用户隐藏某些内容?仅仅因为成员以上述方式隐藏并不意味着您不能在代码中使用它并成功编译它。它只是抑制了成员的可发现性。

    【讨论】:

    • 隐藏我的意思是完全“删除”它,这样你就无法访问它。这是因为 Button 的某些属性不适用于我的控件。
    • 您是否考虑过将 Button 类的父类子类化并重新实现您需要的东西?我会考虑提出一个新问题,深入了解您需要更改按钮行为的原因,并寻找不同的方法来实现这一点。
    【解决方案3】:

    不,您可以从设计器中删除它们(如图所示),但您不能真正将它们隐藏在代码中,因为这会违反替换原则。此处已被多次询问和回答,例如请参阅this SO question

    【讨论】:

      【解决方案4】:

      也许您想要做的是从 ContainerControl 或 UserControl 派生,向该控件添加一个 Button,然后只公开您想要保留的 Button 界面的那些部分。

      【讨论】:

        【解决方案5】:

        你为什么不把它设为私有?它保证祖先不会看到它。 编辑: 在这种情况下,您必须从基类继承一个新类并使用您的新类,它现在隐藏了这个属性。

        public class MyTextBox: TextBox
        {
        ...
                private new ContentAlignment TextAlign
                {
                  get { return base.ContentAlignment; }
                  set { base.ContentAlignment = value; }
                }
        }
        

        【讨论】:

        • 因为这可能会也可能不会。有时你只是想从 GUI 中隐藏一些东西。
        • 我刚试过这个 - 属性仍然出现在设计器中。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多