2010-03-25 20 views

Respuesta

17

MSDN dice it all:

Especifica si una propiedad o evento debe mostrarse en una ventana de Propiedades.

Por ejemplo, si va a crear un control de usuario, es posible que desee para decorar propiedades no relacionadas con la interfaz de usuario, con [Browsable(false)] para que no estarán disponibles a través de una ventana "Propiedades".

Además, controla qué propiedades de un objeto se pueden ver en un PropertyGrid.

En cuanto a por qué podemos pasar true explícitamente, creo que esto se debe a BrowsableAttributes propiedad de un PropertyGrid. Puede configurarlo para que contenga BrowsableAttribute.No, de modo que la cuadrícula de propiedades muestre todos los miembros no navegables.

+1

Esto no responde la pregunta. – SLaks

+1

@SLaks: Responde a la pregunta original, pero no su reinterpretación. –

+0

Estoy bastante seguro de que mi interpretación es correcta. (De lo contrario, no habría dicho 'verdadero') – SLaks

22

Por lo que sé, nunca.

EDITAR

que estaba equivocado.
Es necesario si desea hacer una propiedad que tenga [Browsable(false)] en su clase base (como UserControl.Text) navegable.

+0

¿Por qué se bajó este valor? – SLaks

+1

Buena explicación de dónde se usaría específicamente. – itsmatt

-1

BrowsableAttribute Class (System.ComponentModel)

La documentación:

Un diseñador visual suele mostrar en la ventana Propiedades de los miembros que o bien no tienen atributo navegables o están marcados con el parámetro navegable del BrowsableAttribute constructor establecido en verdadero.

[Browsable] también se predetermina a true.

... así que técnicamente, nunca necesita [Browsable(true)] a menos que desee ser muy explícito.

+1

'nunca ... excepto ..' no es correcto/completo, principalmente la clase base primordial que tiene un valor 'falso'. – EricG

0

Un diseñador visual normalmente muestra en la ventana Propiedades aquellos miembros que no tienen atributos navegables o están marcados con el parámetro navegable del constructor BrowsableAttribute establecido en verdadero. Estos miembros se pueden modificar en el momento del diseño. Los miembros marcados con el parámetro navegable del constructor BrowsableAttribute establecido en falso no son apropiados para la edición en tiempo de diseño y, por lo tanto, no se muestran en un diseñador visual. El valor predeterminado es true.

, la respuesta es que nunca tiene, ya que está hecho de forma predeterminada.

+0

Esto no responde la pregunta. – SLaks

+0

allí, agregué una respuesta. –

+1

Esto está mal; hay casos donde tienes que hacerlo. – SLaks

0

De acuerdo con the documentation, quiere que sea verdadero cuando se debe mostrar en la ventana de propiedades en VS. Básicamente se aplica a las clases que se utilizan en el diseñador.

+0

Es 'verdadero' por defecto. Solo necesita especificar el atributo al configurarlo en 'false'. – SLaks

+0

sí, pero las propiedades se pueden examinar de forma predeterminada. Creo que el OP preguntó si hay casos en que una propiedad necesita este conjunto a * verdadero * para aparecer. –

+0

@SLaks y @Isak Guarde los puntos buenos. Supongo que un valor de atributo de verdadero tiene sentido cuando se anula una propiedad en una clase principal que lo ha establecido en falso explícitamente. –

3

Probablemente cuando se quiere hacer totalmente seguro de que nadie lo cambia: P

// I want to see this, dont change it to false or I'll hunt you down... 
[Browsable(true)] 
public int MyProperty { 
    get { 
     // Insert code here. 
     return 0; 
    } 
    set { 
     // Insert code here. 
    } 
} 
+1

No necesita el atributo; el comentario solo debería ser lo suficientemente bueno. – SLaks

+0

jaja, eso es cierto, pero el navegador les dice exactamente de qué atributo está hablando – SwDevMan81

+0

Puede cambiar el comentario a '// NO agregar [Browsable (falso)]' – SLaks

0

una ocasión cuando este atributo se convierte en importante es durante el desarrollo WebPart para SharePoint. En este escenario, está proporcionando metainformación para Sharepoint para determinar si su parte web debe poder verse, etc. Hay otros atributos similares, como Category y FriendlyName, que también se tienen en cuenta.

Véanse los siguientes ejemplos:

Creating a web part with custom properties

y otro con imágenes dignas del editor SharePoint parte web que refleja sus atributos:

Making Sharepoint WebParts interact

1

Los tipos y atributos en ComponentModel son no específicamente vinculado a ningún diseñador en particular. Aunque no conozco ningún escenario específico en el que deba "optar por" ser navegable por el diseñador, supongo que es concebible que pueda tener algún diseñador de componentes que suponga navegable (falso).

Supongo que también podría anular una propiedad virtual que especificó browsable (false) y aplicar browsable (true) en el miembro anulado.

+0

El diseñador de iOS de Xamarin se predetermina a las propiedades que no son designables. Debe especificar [Browsable (true)] para que aparezcan en el panel de propiedades. https://developer.xamarin.com/guides/ios/user_interface/designer/ios_designable_controls_overview/#Custom_Properties – chkn

3

El problema es que las cosas se pueden consultar de forma predeterminada. El único escenario en el que puedo pensar que importaría es anular un miembro y cambiar la capacidad de navegación ... aquí F es visible solo por [Browsable(true)] en la clase derivada - sin él, no está visible.

using System.ComponentModel; 
using System; 
using System.Windows.Forms; 
static class Program 
{ 
    [STAThread] 
    static void Main() { 
     Application.EnableVisualStyles(); 
     Application.Run(new Form { Controls = {new PropertyGrid { 
      Dock = DockStyle.Fill, SelectedObject = new Bar() 
     }}}); 
    } 
} 
public class Foo 
{ 
    public virtual string A { get; set; } 
    public virtual string B { get; set; } 
    public virtual string C { get; set; } 
    [Browsable(false)] public virtual string D { get; set; } 
    [Browsable(false)] public virtual string E { get; set; } 
    [Browsable(false)] public virtual string F { get; set; } 
    [Browsable(true)] public virtual string G { get; set; } 
    [Browsable(true)] public virtual string H { get; set; } 
    [Browsable(true)] public virtual string I { get; set; } 
} 
public class Bar : Foo 
{ 
    public override string A { get { return base.A; } set { base.A = value; } } 
    [Browsable(false)] public override string B { get { return base.B; } set { base.B = value; } } 
    [Browsable(true)] public override string C { get { return base.C; } set { base.C = value; } } 
    public override string D { get { return base.D; } set { base.D = value; } } 
    [Browsable(false)] public override string E { get { return base.E; } set { base.E = value; } } 
    [Browsable(true)] public override string F { get { return base.F; } set { base.F = value; } } 
    public override string G { get { return base.G; } set { base.G = value; } } 
    [Browsable(false)] public override string H { get { return base.H; } set { base.H = value; } } 
    [Browsable(true)] public override string I { get { return base.I; } set { base.I = value; } } 
} 
Cuestiones relacionadas