Скрытие нежелательных свойств в пользовательских элементах управления

Является ли это способом скрытия свойств в производных элемента управления?

public class NewButton : Button

...

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

Также это скрывает свойство в окне свойств в конструкторе, но как я могу скрыть свойство в коде?

Ответы

Ответ 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; }

Лично я не стал бы беспокоиться. Он не является надежным (просто отличным).

Ответ 2

Вы можете использовать атрибут [EditorBrowsable], как описанный здесь.

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

Из документации:

... движок IntelliSense в Visual Studio использует этот атрибут, чтобы определить, показывать ли свойство или метод.

Однако пользователи могут переопределить это в настройках VS. ReSharper также имеет параметр, который контролирует, соблюдается ли этот атрибут в IntelliSense.

Из любопытства, почему вы хотите что-то скрывать от пользователей? Просто потому, что элемент скрыт описанным выше способом, это не означает, что вы не можете использовать его в коде и скомпилировать его успешно. Это просто препятствует обнаружению члена.

Ответ 3

Возможно, что вы хотите сделать, это вывод из ContainerControl или UserControl, добавьте кнопку к этому элементу управления и просто покажите те части интерфейса Button, которые вы хотите сохранить.

Ответ 4

Нет, вы можете удалить их из конструктора (как показано), но вы не можете скрыть их код формы, поскольку это нарушит принцип подстановки. Его спрашивали и много раз говорили здесь, см., Например, этот вопрос SO.

Ответ 5

Почему бы вам не сделать это частным? Это гарантирует, что предки этого не видят. Редактировать: В этом случае вам нужно наследовать новый класс из базы и использовать свой новый класс, который теперь скрывает свойство.

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