diálogo personalizada com um campo de texto no WinMobile
-
08-07-2019 - |
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!
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.