2009-10-06 24 views
13

¿Es esta la manera de ocultar propiedades en controles derivados?Ocultar propiedades no deseadas en controles personalizados

public class NewButton : Button

...

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

También esta oculta la propiedad en la ventana Propiedades en el diseñador, pero ¿cómo puede también ocultar la propiedad en el código?

Respuesta

15

a partir del código, lo más cerca que se puede hacer para ocultarlo, y tal vez lo convierten en un dolor para llamar directamente - en cuenta que incluso cuando se oculta es exigible, y nada de esto va a funcionar más allá de un reparto:

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

Personalmente, no me molestaría. No es robusto (solo lanzado).

+0

Gracias Marc. Por elenco te refieres a lanzar a la clase principal en este caso, ¿botón? –

1

Tal vez lo que quiere hacer es derivar de ContainerControl o UserControl, agregar un botón a ese control y simplemente exponer las partes de la interfaz de Button que desea conservar.

1

No, puede eliminarlos del diseñador (como se muestra) pero realmente no puede ocultarlos del código porque eso violaría el principio de sustitución. Se ha preguntado & respondido muchas veces aquí, ver por ejemplo this SO question.

2

Puede usar el atributo [EditorBrowsable], como documented here.

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

De la documentación:

... el motor IntelliSense en Visual Studio utiliza este atributo para determinar si se debe mostrar una propiedad o método.

Sin embargo, los usuarios pueden anular esto en la configuración de VS. ReSharper también tiene una configuración que controla si este atributo se respeta en su IntelliSense.

Por curiosidad, ¿por qué quieres ocultar algo a los usuarios? El hecho de que un miembro esté oculto de la manera descrita anteriormente no significa que no pueda usarlo en el código y compilarlo correctamente. Solo inhibe la capacidad de descubrimiento del miembro.

+0

Al esconderme quise "eliminarlo" por completo para que no pueda acceder a él. Es porque algunas de las propiedades de Button no se aplican a mi control. –

+0

¿Ha considerado subclasificar un padre de la clase Button y volver a implementar lo que necesita? Consideraría hacer una nueva pregunta que profundiza en la razón por la cual necesita cambiar el comportamiento del botón y busca diferentes formas de lograrlo. –

0

¿Por qué no lo haces privado? Garantiza que los antepasados ​​no lo verán. Edit: En este caso, debe heredar una nueva clase de la base y usar su nueva clase, que ahora oculta esta propiedad.

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

Porque esto podría o no ser posible. A veces solo quieres ocultar algo de la GUI. –

+0

Acabo de probar esto - la propiedad todavía aparece en el diseñador. – JPNotADragon

Cuestiones relacionadas