开发者

Hiding unwanted properties in custom controls

开发者 https://www.devze.com 2022-12-08 01:08 出处:网络
Is this the way to hide properties in derived controls? public class NewButton : Button ... [Browsable ( false )]

Is this the way to hide properties in derived controls?

public class NewButton : Button

...

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

Also 开发者_高级运维this hides the property in the Properties window in the designer but how can I also hide the property in code?


From code, the closest you can do it to hide it, and perhaps make it a pain to call directly - note that even when hidden it is callable, and none of this will work past a cast:

// 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; }

Personally, I wouldn't bother. It isn't robust (just cast).


You can use the [EditorBrowsable] attribute, as documented here.

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

From the documentation:

...the IntelliSense engine in Visual Studio uses this attribute to determine whether to show a property or method.

However, users can override this in VS settings. ReSharper also has a setting that controls whether this attribute is honoured in its IntelliSense.

Out of curiousity, why do you want to hide something from users? Just because a member is hidden in the way described above doesn't mean you couldn't use it in code and compile it successfully. It just inhibits the discoverability of the member.


No, you can remove them from the designer (as shown) but you cannot really hide them form code as that would violate the substitution principle. It has been asked & answered many times here, see for example this SO question.


Maybe what you want to do is derive from ContainerControl or UserControl, add a Button to that control and just expose those parts of the Button interface you want to keep.


Why don't you make it private? It guarantees that ancestors will not see it. Edit: In this case you have to inherit a new class from the base and use your new class, which now hides ths property.

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

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号