【发布时间】:2010-12-04 10:38:20
【问题描述】:
这是在派生控件中隐藏属性的方法吗?
public class NewButton : Button
...
[Browsable ( false )]
public new ContentAlignment TextAlign { get; set; }
这也隐藏了设计器的“属性”窗口中的属性,但我怎样才能在代码中隐藏该属性?
【问题讨论】:
这是在派生控件中隐藏属性的方法吗?
public class NewButton : Button
...
[Browsable ( false )]
public new ContentAlignment TextAlign { get; set; }
这也隐藏了设计器的“属性”窗口中的属性,但我怎样才能在代码中隐藏该属性?
【问题讨论】:
从代码中,您可以最接近地隐藏它,并且直接调用可能会很痛苦 - 请注意,即使隐藏它也是可调用的,并且这些都不会在强制转换后起作用:
// 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; }
就个人而言,我不会打扰。它不健壮(只是强制转换)。
【讨论】:
您可以使用[EditorBrowsable] 属性,如documented here。
[EditorBrowsable(EditorBrowsableState.Never)]
public bool HideMeInIntellisense
{
// ...
来自文档:
...Visual Studio 中的 IntelliSense 引擎使用此属性来确定是否显示属性或方法。
但是,用户可以在 VS 设置中覆盖它。 ReSharper 还有一个设置,用于控制是否在其 IntelliSense 中支持此属性。
出于好奇,您为什么要对用户隐藏某些内容?仅仅因为成员以上述方式隐藏并不意味着您不能在代码中使用它并成功编译它。它只是抑制了成员的可发现性。
【讨论】:
不,您可以从设计器中删除它们(如图所示),但您不能真正将它们隐藏在代码中,因为这会违反替换原则。此处已被多次询问和回答,例如请参阅this SO question。
【讨论】:
也许您想要做的是从 ContainerControl 或 UserControl 派生,向该控件添加一个 Button,然后只公开您想要保留的 Button 界面的那些部分。
【讨论】:
你为什么不把它设为私有?它保证祖先不会看到它。 编辑: 在这种情况下,您必须从基类继承一个新类并使用您的新类,它现在隐藏了这个属性。
public class MyTextBox: TextBox
{
...
private new ContentAlignment TextAlign
{
get { return base.ContentAlignment; }
set { base.ContentAlignment = value; }
}
}
【讨论】: