Pregunta

Estoy buscando tener un cuadro de diálogo personalizado simple, como un cuadro de mensaje, que tenga una etiqueta y un cuadro de texto. Si hay una manera simple de hacer esto, ¡lo siento! Realmente no estoy bien versado en las cosas del diálogo.

¡Gracias por cualquier ayuda, muchachos!

¿Fue útil?

Solución

Aquí se explica cómo crear un pequeño cuadro de diálogo personalizado en Windows Mobile que se vea así:

texto alternativo http://www.freeimagehosting.net/uploads/b8fb5421d6.jpg

Agregue un formulario a su proyecto y establezca su propiedad FormBorderStyle en None. Esto permite cambiar el tamaño y posicionar el formulario, pero también significa que no tiene borde ni barra de título, y que no hay forma de que el usuario lo mueva.

Entonces tienes que fingir los tres. La forma más fácil de falsificar el borde y la barra de título es crear el BackColor de su formulario SystemColors.WindowFrame, luego poner una etiqueta (donde dice "Diálogo" en la imagen) con BackColor = SystemColors.Highlight y ForeColor = SystemColor. HighlightText (y en negrita la fuente), luego coloque un panel con BackColor = SystemColors.Window donde vea blanco en la imagen. Debe ajustar las posiciones y los tamaños de la etiqueta y el panel para que tenga un borde de 1 píxel (que es solo el BackColor de su formulario que se muestra).

Para permitir que el formulario sea arrastrado por su barra de título falsa, agregue este código al formulario (y, por supuesto, también debe conectar los eventos):

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;
    }
}

Otro problema es que debido a que no hay una barra de título real, no hay forma de que el usuario cierre el formulario. Debe agregar un botón Aceptar (o Cerrar) y ponerlo en el evento Click del botón:

this.DialogResult = DialogResult.OK;

Normalmente, usaría el evento del mouse en la barra de título para facilitar el arrastre, pero el control de etiqueta no tiene ningún evento del mouse. Con este código, podría agarrar cualquier parte del formulario y arrastrarlo, excepto que el panel lo bloquea y hace que la barra de título sea el único lugar para agarrar y arrastrar.

Mi otra respuesta tiene más detalles sobre cómo recuperar información de los cuadros de diálogo personalizados.

Actualización: en realidad, no existe una forma obvia de cerrar un formulario sin bordes sin agregar su propio botón Aceptar. Siempre y cuando no establezca la propiedad ControlBox de su formulario en False, el botón Aceptar o X en la esquina superior derecha de la pantalla Hoy cerrará su cuadro de diálogo, incluso si no lo parece, ya que no está realmente en el formulario.

Otros consejos

Si desea una solución súper simple pero [t] fea, puede incluir una referencia en su proyecto a Microsoft.VisualBasic, que le permite usar la función VB InputBox de esta manera:

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

El cuadro de diálogo ocupa toda la pantalla, pero es fácil de usar. Pero es increíblemente feo, como mencioné.

Supongo que básicamente desea un cuadro de diálogo personalizado que devuelva una cadena ingresada por el usuario. Una forma es agregar una referencia a Microsoft.VisualBasic a su proyecto, que le da acceso al método InputBox, que es básicamente un cuadro de mensaje con un cuadro de texto. Pero eso no es divertido y no estoy seguro de que funcione en un teléfono inteligente de todos modos.

Para rodar el suyo, simplemente agregue un formulario (denominado CustomDialog) a su proyecto y arrastre un cuadro de texto (textBox1), una etiqueta (label1) y un botón (etiquetado " OK ") sobre él.

Para establecer el texto de la etiqueta, agregue un parámetro al constructor del formulario como este:

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

Para exponer el texto ingresado a la persona que llama, agregue este código al formulario:

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

En el evento de clic del botón Aceptar, coloque este código:

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

Para usar este cuadro de diálogo desde su formulario principal, cree una instancia de este formulario, muéstrela, verifique que se haya hecho clic en el botón Aceptar y luego lea su propiedad Texto (que devuelve lo que ingresó el usuario) así:

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

Puedes ponerte más elegante, pero esos son los conceptos básicos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top