2011-01-31 4 views
6

Sto ridimensionando il mio controllo personalizzato utilizzando il seguente codice:Come faccio a ridimensionare un controllo personalizzato che ho costruito

private void Form1_Resize_1(object sender, EventArgs e) 
{ 

    textBox1.Text = this.Width.ToString(); 
    textBox2.Text = (this.Height - 200).ToString(); 

    canvas21.Size = new System.Drawing.Size(this.ClientSize.Width, this.ClientSize.Height - this.Top - 15); 

    canvas21.Invalidate(); 

} 

Voglio solo l'angolo in alto a sinistra del controllo personalizzato (0, 105) a rimanere sul posto e il controllo per ridimensionare insieme al modulo, ma per qualche motivo questo non funziona. Quando ridimensiono il controllo rimane in posizione, ma ridimensiona automaticamente per compilare il resto del modulo.

Overview of form layout

C'è un modo per ottenere un elenco di tutto ciò che riguarda le dimensioni di un UserControl. Per cercare altri luoghi la dimensione che ho impostato, che avrei potuto trascurare?

+1

Avete già studiato le proprietà 'Dock' e' Anchor'? L'utilizzo di uno o entrambi è * molto * più semplice dell'implementazione manuale della logica di ridimensionamento nell'evento 'Resize' come avremmo dovuto fare per anni prima. –

+0

@Cody - ho provato entrambi, ma non riesco a ottenere il risultato che voglio. Vedi la mia risposta a ho1. – Bildsoe

+0

Poco chiaro cosa viene chiesto. Lo snippet di codice è decisamente sbagliato, dovrebbe utilizzare ClientSize e sottrarre i valori di proprietà Left e Top del controllo. –

risposta

6

Se si desidera ridimensionare sempre il controllo con il modulo, è possibile utilizzare la proprietà Anchor per impostarlo per essere ancorato a uno o più lati del modulo in modo che non sia necessario il proprio codice di ridimensionamento (partendo dal presupposto che la funzionalità di ridimensionamento standard che si ottiene con questo si adatta alle vostre esigenze).

È necessario assicurarsi che la proprietà Dock non sia impostata, altrimenti potrebbe riempire l'intero modulo (o un lato del modulo in base alle impostazioni).

+0

ho provato a utilizzare la proprietà Anchor, ma continua a compilare il resto del modulo in basso ea destra. Ho un tabControl in alto, un controllo personalizzato sotto di esso e un'etichetta sotto il controllo personalizzato. Voglio che il controllo personalizzato compili il modulo tranne 15 pixel nella parte inferiore. – Bildsoe

+0

@bildsoe: Quindi ti sei assicurato che la proprietà 'Dock' non sia impostata? –

+0

@bildsoe: giusto per chiarire, la proprietà 'Dock' sovrascriverà la proprietà' Anchor'. Se non è impostato nelle proprietà, farei una ricerca del codice per assicurarmi che non venga impostato da qualche altra parte e suggerirei anche una ricerca attraverso il codice per qualsiasi istanza in cui imposti le proprietà di quel controllo (incluso all'interno del controllo stesso!) per vedere se imposti da qualche parte le proprietà 'Dock' o' Size' che potrebbero essere la ragione. –

2

L'utilizzo della proprietà Anchor è il modo migliore per andare se è possibile impostarlo. Quelli per bloccare sono

left, top, right, bottom (all!) 

Anchor tiene controllare x unità formano il lato che è stato bloccato, in modo che sia sempre la stessa distanza dai lati.

Se questo è non è un'opzione, o semplicemente per ottenere il vostro codice di andare, provate questo

private void Form1_Resize_1(object sender, EventArgs e) 
{ 
    textBox1.Text = this.Width.ToString(); 
    textBox2.Text = (this.Height - 200).ToString(); 

    int iTop = canvas21.Top; 
    int iLeft = canvas21.Left; 
    // - 200 - iTop keeps it 200 from the bottom, -iLeft keeps i stuck to right 
    canvas21.Size = new System.Drawing.Size(this.Width -iLeft, this.Height-200 -iTop); 
    canvas21.Left = iLeft; // move back 
    canvas21.Top = iTop; // move back 
    canvas21.Invalidate(); 
} 

Per tenerlo 15 pixels in the bottom, cambiare 200 sopra per 15. Oppure, impostarlo su 15 in fase di progettazione o tramite codice, attivare l'ancoraggio bottom.

+0

@cyberwiki - Non ha funzionato. Sto cercando luoghi in cui ho impostato la dimensione o il Dock, ma non ne trovo nessuno, quindi non sembra essere il problema – Bildsoe

0

Per i controlli diversi dal controllo personalizzato è possibile ridurlo correttamente? Ad esempio, se inserisci un richtextbox e imposta Anchor di conseguenza (Tutti), verrà ridimensionato correttamente per te? Se lo fa, allora ci deve essere somthing pesce con il dimensionamento del vostro controllo, ma si potrebbe forse imbrogliare è in questo modo ...

  1. creare un pannello che è l'esatta dimensione e di ancoraggio che si desidera dal vostro controllo .
  2. Aggiungi il tuo controllo al Pannello e imposta il Dock su "Riempi". Effettivamente, riempirai il pannello con il tuo controllo e utilizzerai il pannello per controllare il ridimensionamento sul modulo.

Se, ovviamente, il pannello non viene ridimensionato correttamente, questo non funzionerà per voi. È probabile che questo sia una soluzione alternativa a un problema di codice sottostante che in un mondo perfetto verrebbe rimosso dal controllo stesso.

0

sto guardando il ridimensionamento un controllo utente, e sto usando eventi per gestire questa situazione (ad es. OnSizeChanged, OnFontChanged, OnTextChanged)

A seconda di come le vostre caselle di testo si inseriscono nel vostro controllo farà una differenza, ma se il tuo contenitore principale ha la proprietà AutoScaleMode o AutoSize, potresti scoprire che non stai prendendo tutti gli eventi rilevanti.

Mi chiedo in anticipo se sono off-beam perché sono nuovo per questo genere di cose.

ps. Inizialmente non ho trovato il tuo post, visto che guardavo i tag Windows-forms-designer e custom-control. Non so davvero quali tag dovrei usare e non posso usare tutte le possibilità visto che il limite di 5 prende il sopravvento!

4

Non c'è davvero alcun motivo per cui l'impostazione dell'altezza e quindi l'ancoraggio su ogni lato (con il collegamento impostato su nessuno) non dovrebbe funzionare.

Tuttavia, ho notato un errore nella logica del codice fornito. Hai:

canvas21.Size = new System.Drawing.Size(this.ClientSize.Width, this.ClientSize.Height - this.Top - 15); 

Quando si dovrebbe in realtà essere:

canvas21.Size = new System.Drawing.Size(this.ClientSize.Width, this.ClientSize.Height - this.canvas21.Top - 15); 

Stavi solo prendendo la parte superiore del modulo, piuttosto che la parte superiore del canvas21, che è quello che serve.

Questo sembra fare esattamente quello che vuoi, almeno dal mio punto di vista. Se non funziona, non è semplicemente ridimensionamento per te o sta ridimensionando alla dimensione sbagliata?

0

Amico, ti prenderai a calci. Non vuoi ClientSize.Height - Top - 15, vuoi ClientSize.Height - canvas21.Top - 15. Questo è tutto!

private void Form1_Resize_1(object sender, EventArgs e) 
{ 
    textBox1.Text = this.Width.ToString(); 
    textBox2.Text = (this.Height - 200).ToString(); 

    canvas21.Size = new System.Drawing.Size(this.ClientSize.Width, 
     this.ClientSize.Height - canvas21.Top - 15); 

    canvas21.Invalidate(); 
} 
+0

L'ho già indicato nel mio post: P – Yetti

+0

Sì, l'ho visto dopo postato. Ho upvoted la tua risposta. –