Pergunta

Eu estou olhando para ter uma caixa de diálogo simples costume, como uma caixa de mensagem, que tem um rótulo e uma caixa de texto. Se há uma maneira simples de fazer isso, desculpe! Estou realmente não bem versado no material de diálogo.

Obrigado por qualquer ajuda, rapazes!

Foi útil?

Solução

Aqui é como fazer uma caixa de diálogo personalizada pequeno em Windows Mobile que se parece com isso:

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

Adicionar um formulário para o seu projeto, e defina sua propriedade FormBorderStyle para Nenhum. Isso permite que o formulário para ser redimensionadas e posicionadas, mas também significa que ele não tem nenhuma borda ou barra de título, e não há nenhuma maneira para o usuário para movê-lo.

Então, você tem que fingir todos os três. A maneira mais fácil de falsificar a fronteira ea barra de título é fazer a BackColor do formulário SystemColors.WindowFrame, em seguida, colocar um rótulo (onde diz "Dialog" na imagem) com BackColor = SystemColors.Highlight e ForeColor = SystemColor.HighlightText (e negrito a fonte), em seguida, colocar um painel com BackColor = SystemColors.Window onde você vê o branco na imagem. Você tem que ajustar as posições e tamanhos do rótulo e o painel para que você tenha uma borda de 1 pixel (que é apenas a cor de fundo de seu formulário mostrando através).

Para ativar o formulário a ser arrastado pelo seu falso barra de título, adicione este código ao formulário (e, claro, você tem que conectar-se os eventos, também):

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

Um outro problema é que porque não há uma verdadeira barra de título, não há nenhuma maneira para o usuário para fechar o formulário. Você tem que adicionar um botão OK (Close ou), e colocar isso no evento Click do botão:

this.DialogResult = DialogResult.OK;

Normalmente, você usaria o evento do mouse na barra de título para facilitar arrastando, mas o controle de rótulo não tem nenhum eventos de mouse. Com este código você realmente pode pegar em qualquer lugar no formulário e arraste-lo, exceto o painel de blocos este e faz com que a barra de título o único lugar para agarrar e arrastar.

A minha outra resposta tem mais detalhes sobre como obter informações de volta a partir de diálogos personalizados.

Update: na verdade, só há nenhum óbvia maneira de fechar um formulário sem fronteiras, sem adição de seu próprio botão OK. Enquanto você não definir propriedade CaixaDeControle do formulário como False, o botão OK ou X no canto superior direito da tela Hoje vai fechar o diálogo, mesmo se ele não parece que vai desde que não é realmente sobre a formulário.

Outras dicas

Se você quiser um super-simples, mas [a] solução feia, você pode incluir uma referência em seu projeto para Microsoft.VisualBasic, que permite que você use a função VB InputBox como esta:

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

A janela ocupa a tela inteira, mas é simples de usar. Mas é incrivelmente feio, como eu mencionei.

Eu estou supondo que você quer, basicamente, uma caixa de diálogo personalizada que retorna uma string digitado pelo usuário. É uma maneira de adicionar uma referência para Microsoft.VisualBasic para seu projeto, que lhe dá acesso ao método InputBox, que é basicamente uma caixa de mensagem com uma caixa de texto sobre ele. Mas isso não é divertido e eu não tenho certeza se ele iria trabalhar em um smartphone de qualquer maneira.

Para lançar seu próprio, basta adicionar um formulário (chamado CustomDialog) ao seu projeto e arrastar uma caixa de texto (textBox1), um rótulo (label1) e um botão (identificado como "OK") para ele.

Para definir o texto da etiqueta, adicionar um parâmetro para o construtor do formulário como este:

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

Para expor o texto introduzido para o chamador, adicione este código ao formulário:

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

No evento clique do botão OK, colocar esse código:

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

Para usar esta janela de seu formulário principal, você cria uma instância desta forma, mostrá-lo, verifique se o botão OK foi clicado, e em seguida, ler a propriedade de texto (que retorna o que o usuário digitou) assim:

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

Você pode obter mais extravagante, mas esses são os princípios.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top