Domanda

Sto cercando di avere una semplice finestra di dialogo personalizzata, come una finestra di messaggio, con un'etichetta e una TextBox. Se c'è un modo semplice per farlo, scusa! Non sono davvero molto esperto nelle cose dei dialoghi.

Grazie per l'aiuto, ragazzi!

È stato utile?

Soluzione

Ecco come creare una piccola finestra di dialogo personalizzata in Windows Mobile simile a questa:

alt text http://www.freeimagehosting.net/uploads/b8fb5421d6.jpg

Aggiungi un modulo al tuo progetto e imposta la sua proprietà FormBorderStyle su Nessuno. Ciò consente di ridimensionare e posizionare il modulo, ma significa anche che non ha bordi o barra del titolo e che l'utente non può spostarlo.

Quindi devi fingere tutti e tre. Il modo più semplice per falsificare il bordo e la barra del titolo è creare il BackColor del tuo modulo SystemColors.WindowFrame, quindi mettere un'etichetta (dove dice " Finestra di dialogo "; nell'immagine) con BackColor = SystemColors.Highlight e ForeColor = SystemColor. Evidenzia Testo (e in grassetto il carattere), quindi metti un pannello con BackColor = SystemColors.Window dove vedi il bianco nell'immagine. Devi modificare le posizioni e le dimensioni dell'etichetta e del pannello in modo da avere un bordo di 1 pixel (che è solo il BackColor del modulo che mostra attraverso).

Per consentire al modulo di essere trascinato dalla sua barra del titolo falsa, aggiungi questo codice al modulo (e ovviamente devi anche collegare gli eventi):

private bool _Moving = false;
private Point _Offset;
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
    _Moving = true;
    _Offset = new Point(e.X, e.Y);
}

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
    if (_Moving)
    {
        Point newlocation = this.Location;
        newlocation.X += e.X - _Offset.X;
        newlocation.Y += e.Y - _Offset.Y;
        this.Location = newlocation;
    }
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
    if (_Moving)
    {
        _Moving = false;
    }
}

Un altro problema è che, poiché non esiste una barra del titolo reale, l'utente non può chiudere il modulo. Devi aggiungere un pulsante OK (o Chiudi) e inserirlo nell'evento Click del pulsante:

this.DialogResult = DialogResult.OK;

Normalmente useresti l'evento del mouse sulla barra del titolo per facilitare il trascinamento, ma il controllo dell'etichetta non ha eventi del mouse. Con questo codice puoi effettivamente prendere qualsiasi punto del modulo e trascinarlo, tranne il pannello lo blocca e rende la barra del titolo l'unico posto dove prendere e trascinare.

L'altra mia risposta ha maggiori dettagli su come recuperare informazioni dalle finestre di dialogo personalizzate.

Aggiornamento: in realtà, non esiste un modo ovvio per chiudere un modulo senza bordi senza aggiungere il proprio pulsante OK. Finché non imposti la proprietà ControlBox del tuo modulo su False, il pulsante OK o X nell'angolo in alto a destra della schermata Oggi chiuderà la finestra di dialogo, anche se non sembra che lo sia poiché non si trova effettivamente nella finestra modulo.

Altri suggerimenti

Se vuoi una soluzione super-semplice ma [t] brutta, puoi includere un riferimento nel tuo progetto a Microsoft.VisualBasic, che ti consente di utilizzare la funzione VB InputBox in questo modo:

string s = Microsoft.VisualBasic.Interaction.InputBox("prompt text",
    "title text", "default value", 0, 0);

La finestra di dialogo occupa l'intero schermo, ma è semplice da usare. Ma è incredibilmente brutto, come ho già detto.

Suppongo che in pratica desideri una finestra di dialogo personalizzata che restituisca una stringa immessa dall'utente. Un modo è aggiungere un riferimento a Microsoft.VisualBasic al tuo progetto, che ti dà accesso al metodo InputBox, che è fondamentalmente una finestra di messaggio con una casella di testo su di esso. Ma non è divertente e non sono sicuro che funzionerebbe comunque su uno smartphone.

Per creare il tuo, basta aggiungere un modulo (chiamato CustomDialog) al progetto e trascinare una casella di testo (textBox1), un'etichetta (label1) e un pulsante (etichettato " OK ") su di esso.

Per impostare il testo dell'etichetta, aggiungere un parametro al costruttore del modulo in questo modo:

public CustomDialog(string textCaption)
{
    label1.Text = textCaption;
}

Per esporre il testo inserito al chiamante, aggiungi questo codice al modulo:

public override string Text
{
    get
    {
        return textBox1.Text;
    }
}

Nell'evento clic del pulsante OK, inserisci questo codice:

this.DialogResult = DialogResult.OK; // this will close the form, too

Per utilizzare questa finestra di dialogo dal modulo principale, creare un'istanza di questo modulo, mostrarlo, verificare che sia stato fatto clic sul pulsante OK, quindi leggere la proprietà Text (che restituisce ciò che l'utente ha inserito) in questo modo:

using (CustomDialog dialog = new CustomDialog("What is your name"))
{
    if (dialog.ShowDialog(this) == DialogResult.OK)
    {
        string enteredText = dialog.Text;
    }
}

Puoi diventare più elaborato, ma queste sono le basi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top