Come si fa a ridimensionare una forma, che adatta automaticamente il contenuto?

Sto cercando di implementare il seguente comportamento:

Su un modulo, c’è un tabcontrol. Su che tabcontrol c’è un controllo treeview. Per evitare che le barre di scorrimento che appare, vorrei che il modulo per modificare la sua dimensione in base al contenuto del treeview quando viene visualizzato per la prima volta.

Se il treeview ha troppi nodi per essere visualizzato su una dimensione di default del modulo, il modulo dovrà modificare le dimensioni in modo che non vi è alcuna barra di scorrimento verticale sul treeview (fino a una dimensione massima consentita dalla dimensione dello schermo).

Quello che mi serve sapere è se è possibile ottenere questo comportamento attraverso le proprietà dei controlli. Sono sicuro che questo obiettivo può essere raggiunto mediante il calcolo e le impostazioni le dimensioni degli elementi a livello di programmazione, ma vorrei sapere se c’è un modo per raggiungere questo obiettivo le impostazioni come AutoSizeMode etc.

[AGGIORNAMENTO]

È la prima finestra di un utente della mia applicazione vede: È una finestra di dialogo per selezionare il database per lavorare con. Si tratta di un elenco di database, con un tabcontrol, buttens etc. Se l’elenco è troppo lungo, le barre di scorrimento appaiono e un mio collega li vuole scomparire.

InformationsquelleAutor Inno | 2011-05-11

 

9 Replies
  1. 26

    Utilizzare la proprietà AutoSize e AutoSizeMode proprietà.

    http://msdn.microsoft.com/en-us/library/system.windows.forms.form.autosize.aspx

    Un esempio:

    private void Form1_Load(object sender, EventArgs e)
    {
        //no smaller than design time size
        this.MinimumSize = new System.Drawing.Size(this.Width, this.Height);
    
        //no larger than screen size
        this.MaximumSize = new System.Drawing.Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, (int)System.Windows.SystemParameters.PrimaryScreenHeight);
    
        this.AutoSize = true;
        this.AutoSizeMode = AutoSizeMode.GrowAndShrink;
    
        //rest of your code here...
    }
    • Ho provato a fare qualcosa di simile a questo, ma ho trovato che questo approccio in collaborazione con docking e ancore fatto per davvero strano comportamento a volte. Quindi, di per sé potrebbe funzionare bene, ma se avete qualsiasi tipo di docking quindi potrebbe non valerne la pena.
    • Sistema.Windows.SystemParameters è obsoleto e non funziona con le versioni attuali .NET. Considerare la revisione.
    • ho provato questo, ma ho ancora riesco a ottenere il modulo a crescere quando il contenuto di una centrale ancorato listbox aumento. invece ho una barra di scorrimento nella listbox. Non vedo alcuna proprietà autosize sulla casella stessa. sto indovinando che ho bisogno di inserire in un auto di dimensioni pannello dock-full ?
    • Volevo aggiungere elementi, ridimensionare, e quindi consentire all’utente di ridimensionare troppo. Quindi quello che ho fatto è stato AutoSize = true; OnResize(e); che ridimensionata con i nuovi controlli, quindi salvate la nuova dimensione var newSize = new System.Drawing.Size(this.Width, this.Height); quindi spegnere autosize così rimane controllate dall’utente. Tuttavia facendo in modo che il modulo torna alla sua dimensione precedente, in modo che si può forzare via this.Size = newSize. E Viola! Autosize su richiesta e rimane regolabile dall’utente. Pensato che avrei dovuto condividere.
  2. 14

    Utilizzando le varie proprietà di ridimensionamento (Porto, Ancoraggio) o contenitore di controlli (Pannello di TableLayoutPanel, FlowLayoutPanel, etc.) si può solo dettare la risoluzione dal pannello di controllo esterno basso per i controlli interni. Ma non c’è nulla (di lavoro) entro il .Net framework che permette di dettare le dimensioni di un contenitore attraverso la dimensione del controllo figlio. Anch’io ho perso un paio di volte e provato la proprietà AutoSize, ma non ha mai lavorato.

    In modo che tutto si può fare è cercare di ottenere questa roba fatta manualmente, mi dispiace.

    • sì, in quel senso ho sempre fatto anche manualmente. @jgaufin l’attenzione non si applicano!
    • In realtà, la proprietà AutoSize non di lavoro, non solo molto bene, soprattutto se si hanno anche cercato di ancorare o ancoraggio di uno qualsiasi dei controlli contenuti. WinForms di solito basta avere un crollo mentale in quel punto. Si dovrebbe autosize il contenitore per i controlli o di ancoraggio/dock i controlli per il contenitore, ma mai entrambi. In realtà, zero… solo evitare AutoSize. La vostra sanità mentale vi ringrazio.
    • Concordato, evitare l’uso di autosize, anche si può lavorare. Un altro grande motivo per non usarlo perché impedisce all’utente di essere in grado di manuale di modificare la dimensione di una maschera in fase di runtime. Quasi sempre si desidera che l’utente sia in grado di controllare manualmente la dimensione di una maschera, e se si desidera ridimensionare automaticamente la forma è di solito accompagnata da un evento, quindi, solo di gestire l’evento con un po ‘ di codice per fare il ridimensionamento piuttosto che impostare la proprietà di tutta la vostra forma di comportamento per autosize.
    • È possibile anche un-dock, automatica e ri-dock… dataGridView1.Dock = DockStyle.None; dataGridView1.AutoSize = true; this.AutoSize = true; dataGridView1.Dock = DockStyle.Fill;
  3. 11

    Da MSDN:

    Per massimizzare la produttività, la Progettazione Windows Form ombre
    AutoSize proprietà per la Form classe. In fase di progettazione, la forma
    si comporta come se il AutoSize proprietà è impostata su false,
    a prescindere dalla sua attuale configurazione. In fase di runtime, niente di speciale
    la sistemazione è fatto, e il AutoSize la proprietà viene applicata come
    specificato dall’impostazione della proprietà.

  4. 5

    Si poteva calcolare l’altezza dell’Albero, cercando di capire l’altezza di un nodo, moltiplicando per il numero di nodi, quindi l’impostazione del modulo MinimumSize proprietà di conseguenza.

    //assuming the treeview is populated!
    nodeHeight = treeview1.Nodes[0].Bounds.Height;
    
    this.MaximumSize = new Size(someMaximumWidth, someMaximumHeight);
    
    int requiredFormHeight = (treeView1.GetNodeCount(true) * nodeHeight);
    
    this.MinimumSize = new Size(this.Width, requiredFormHeight);

    NB. Questo presuppone però che il treeview1 il controllo solo nella forma. Quando si imposta il requiredFormHeight variabile sarà necessario per consentire i controlli e requisiti di altezza circostante treeview, come il controllo tabcontrol che hai menzionato.

    (Io, però, sarebbe d’accordo con @jgauffin e valutare la logica che sta dietro il requisito per ridimensionare una forma ogni volta che si carica senza il consenso dell’utente – forse lasciare all’utente la posizione e le dimensioni, la forma e ricordate che, invece???)

    • Ho dovuto creare la mia propria implementazione della “Finestra di Avviso” che imita l’originale .NET Finestra di Dialogo. Nel mio caso, ho la necessità di creare una finestra di dialogo che si adatta dinamicamente generato etichetta di testo all’interno del modulo. Così, in fondo devo solo misurare il controllo dinamico di altezza e larghezza all’interno della finestra, e regolare la larghezza e l’altezza MinimumSize attributo di forma, proprio come questa risposta non. E ho impostato il AutoSize proprietà del controllo e la forma stessa di true. Ottimizzare il controllo con il suo MaximumSize attributo
  5. 5

    Questo potrebbe essere utile.
    Si ridimensiona una nuova forma per un controllo utente, e poi ancora il controllo utente per il nuovo modulo:

    Form f = new Form();
    MyUserControl muc = new MyUserControl();
    f.ClientSize = muc.Size;
    f.Controls.Add(muc);
    muc.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
    f.ShowDialog();
  6. 3

    Questa tecnica risolto il mio problema:

    Nel form padre:

    frmEmployee frm = new frmEmployee();
    frm.MdiParent = this;
    frm.Dock = DockStyle.Fill;
    frm.Show();

    Nel form figlio (evento Load):

    this.WindowState = FormWindowState.Maximized;
  7. 3

    Se si cerca di adattare i contenuti secondo le forme che la seguente vi aiuterà. Aiuta me, mentre stavo cercando di adattare il contenuto sulla forma per adattarsi quando mai le forme sono state ridimensionate.

    questo.contenuti.Size = nuova Dimensione (.ClientRectangle.Larghezza,
    questo.ClientRectangle.Altezza);

  8. 0

    Ho usato questo codice e funziona bene

    const int margin = 5;
            Rectangle rect = new Rectangle(
                Screen.PrimaryScreen.WorkingArea.X + margin,
                Screen.PrimaryScreen.WorkingArea.Y + margin,
                Screen.PrimaryScreen.WorkingArea.Width - 2 * margin,
                Screen.PrimaryScreen.WorkingArea.Height - 2 * (margin - 7));
            this.Bounds = rect;
  9. 0

    Io Utente di questo Codice nel mio progetto, Utile per me.

        private void Form1_Resize(object sender, EventArgs e)
        {
            int w = MainPanel.Width; //you can use form.width when you don't use panels
    
            w = (w - 120)/4; //120 because set 15px for each side of panels
                             //and put panels in FlowLayoutPanel
                             //4 because i have 4 panel boxes
            panel1.Width = w;
            panel2.Width = w;
            panel3.Width = w;
            panel4.Width = w;
        }

    Come si fa a ridimensionare una forma, che adatta automaticamente il contenuto?

Lascia un commento