2009-07-08 8 views
6

Sto creando un controllo etichetta personalizzato (semplicemente ereditando il controllo Label standard e ridipintando lo sfondo e il testo) perché ho bisogno di uno sfondo e di un bordo molto specifici. Nel costruttore del controllo, ho impostato la proprietà AutoSize su false in modo da poter avere una dimensione predefinita standard per la nuova etichetta.Il controllo dell'etichetta si comporta in modo diverso in fase di progettazione rispetto al tempo di esecuzione

Public Sub New() 

    'Set the default size of the control to 75x24 
    Me.Height = 24 
    Me.Width = 75 

    'Turn off the autosize property. 
    Me.AutoSize = False 

    'Turn on double-buffering. 
    Me.DoubleBuffered = True 

End Sub 

Nella mia applicazione che utilizza questo controllo, se creo la nuova etichetta personalizzata in fase di esecuzione (in codice), la proprietà AutoSize rimane False, e funziona correttamente.

Se provo ad aggiungere la nuova etichetta personalizzata al modulo in fase di progettazione, viene fornita con la proprietà AutoSize impostata su True e devo impostarla manualmente su False nella finestra delle proprietà. Non è un problema enorme, ma non capisco perché il comportamento è diverso.

Qualche idea che cosa sta causando questa differenza di comportamento?

+0

Come nota a margine, nel costruttore, impostare AutoSize su false prima di impostare Altezza e Larghezza. – NascarEd

+0

@NascarEd, grazie per la nota. L'ho provato in entrambi i modi e non sembra fare la differenza. – Stewbob

+0

Come nota a margine: dopo aver creato un controllo personalizzato, è sempre consigliabile scartarlo su un modulo ed esaminare il codice generato dal progettista. Il designer di solito fa cose che non ti aspetteresti. – NascarEd

risposta

3

Finalmente ho funzionato in VB. Ho dovuto disabilitare l'istruzione Set, trasformando essenzialmente la proprietà AutoSize sovrascritta in una proprietà di sola lettura.

 Public Overrides Property AutoSize() As Boolean 
     Get 
      Return MyBase.AutoSize 
     End Get 
     Set(ByVal value As Boolean) 
      'Do nothing here 
     End Set 
    End Property 

Grazie a NascarEd per avermi puntato nella giusta direzione.

6

Nella classe etichetta, è necessario sovrascrivere la proprietà AutoSize.

//(In C#) 
[System.ComponentModel.Browsable(false)] 
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)] 
public new bool AutoSize 
{ 
    get { return base.AutoSize; } 
    set { base.AutoSize = value; } 
} 

Il sfogliabile (false) si nasconde la proprietà in fase di progettazione e l'attributo DesignerSerializationVisibility dirà al progettista di non scrivere alcun codice nel file di progettazione.

+0

L'ho implementato, ma anche se il designer non imposta più esplicitamente la proprietà AutoSize su true, come in precedenza, imposta ancora la proprietà .Size come se AutoSize fosse ancora attivo. Forse cercherò di sovrascrivere la proprietà Size anche sul mio controllo. – Stewbob

+0

Anche se questo non sembra funzionare in VB, apprezzo il tuo aiuto. Mi ha dato una visione migliore nella creazione di controlli personalizzati. Grazie! – Stewbob

0

Se si passa alla modalità di progettazione per il nuovo controllo che si sta creando, si dovrebbe essere in grado di selezionare tale controllo e modificare le proprietà come si desidera. Da quel momento in poi, ogni volta che aggiungi quel controllo alla forma (o un altro controllo), avrà le proprietà che hai impostato lì come predefinito. Questo dovrebbe consentire di impostare i valori di default e di tenerli visibili in modo che gli sviluppatori possano cambiare le cose qualora non volessero che fosse ridimensionabile in futuro.

In alternativa, controlla il codice generato dal designer, poiché ti mostrerà esattamente cosa ha fatto per generare il comportamento che stai cercando.

2

Proprio per le informazioni futuro, per impostare la proprietà AutoSize su False nella finestra delle proprietà, è necessario impostare un attributo: -

< System.ComponentModel.DefaultValue (Falso) > _

Public Overrides Property AutoSize() As Boolean ....

+0

Grazie, buone informazioni. – Stewbob

Problemi correlati