настраиваемый диалог с текстовым полем в winmobile - PullRequest
4 голосов
/ 19 ноября 2008

Мне кажется, что у меня есть простое настраиваемое диалоговое окно, например окно сообщения, с меткой и TextBox. Если есть простой способ сделать это, извините! Я действительно не очень разбираюсь в диалогах.

Спасибо за любую помощь, ребята!

Ответы [ 3 ]

11 голосов
/ 20 ноября 2008

Вот как сделать небольшое настраиваемое диалоговое окно в Windows Mobile, которое выглядит следующим образом:

альтернативный текст http://www.freeimagehosting.net/uploads/b8fb5421d6.jpg

Добавьте форму в ваш проект и установите для свойства FormBorderStyle значение None. Это позволяет изменять размеры и расположение формы, а также означает, что у нее нет рамки или заголовка, и пользователь не может ее переместить.

Так что вы должны подделать все три. Самый простой способ подделать границу и строку заголовка - сделать BackColor вашей формы SystemColors.WindowFrame, а затем поместить метку (где на рисунке написано «Диалог») с BackColor = SystemColors.Highlight и ForeColor = SystemColor.HighlightText. (и жирный шрифт), затем поместите панель с BackColor = SystemColors.Window, где вы видите белый цвет на картинке. Вам нужно изменить положение и размеры метки и панели, чтобы у вас была граница в 1 пиксель (это просто BackColor вашей формы, просвечивающий).

Чтобы позволить перетаскиванию формы ее поддельным заголовком, добавьте этот код в форму (и, конечно, вам также нужно связать события):

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

Еще одна проблема заключается в том, что, поскольку в действительности нет заголовка, пользователь не может закрыть форму. Вы должны добавить кнопку OK (или Закрыть) и поместить ее в событие нажатия кнопки:

this.DialogResult = DialogResult.OK;

Обычно вы бы использовали событие мыши в строке заголовка для облегчения перетаскивания, но элемент управления надписью не имеет никаких событий мыши. С помощью этого кода вы можете фактически захватить любое место на форме и перетащить его, за исключением того, что панель блокирует это и делает строку заголовка единственным местом для захвата и перетаскивания.

Мой другой ответ содержит более подробную информацию о получении информации из пользовательских диалогов.

Обновление: на самом деле, нет только очевидного способа закрыть форму без полей без добавления собственной кнопки ОК. Пока вы не установите для свойства формы ControlBox значение False, кнопка «ОК» или «X» в верхнем правом углу экрана «Сегодня» закроет диалоговое окно, даже если оно не будет выглядеть так, как на самом деле на форма.

1 голос
/ 20 ноября 2008

Если вам нужно сверхпростое, но [уродливое] решение, вы можете включить в свой проект ссылку на Microsoft.VisualBasic, которая позволяет вам использовать функцию VB InputBox, например:

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

Диалог занимает весь экран, но прост в использовании. Но, как я уже говорил, это невероятно безобразно.

0 голосов
/ 19 ноября 2008

Я предполагаю, что вы в основном хотите настраиваемое диалоговое окно, которое возвращает строку, введенную пользователем. Одним из способов является добавление в ваш проект ссылки на Microsoft.VisualBasic, которая дает вам доступ к методу InputBox, который в основном представляет собой окно сообщения с текстовым полем на нем. Но это не весело, и я не уверен, что это все равно будет работать на смартфоне.

Чтобы развернуть свою собственную, вы просто добавляете форму (с именем CustomDialog) в свой проект и перетаскиваете в нее текстовое поле (textBox1), метку (label1) и кнопку (помеченную «ОК»).

Чтобы установить текст метки, добавьте параметр в конструктор формы следующим образом:

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

Чтобы выставить введенный текст абоненту, добавьте этот код в форму:

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

В событие нажатия кнопки ОК введите следующий код:

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

Чтобы использовать это диалоговое окно из основной формы, вы создаете экземпляр этой формы, показываете его, проверяете, нажали ли кнопку «ОК», и затем читаете его свойство Text (которое возвращает введенное пользователем) следующим образом:

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

Вы можете полюбить, но это основы.

...