Элементы управления
TextBox
TextBoxWithPrompt
Ограниченные размеры экрана у мобильных устройств заставляют думать об экономии и более эффективном использовании существующих элементов управления. Возьмем текстовое поле, которое часто сопровождается меткой Label, содержащей пояснение для пользователя, например, текст Введите ваше имя. В качестве альтернативы подобному решению можно использовать поясняющий текст-подсказку в самом текстовом поле. Когда текстовое поле получит фокус, то подсказка исчезнет и пользователь может свободно вводить нужную информацию. Если поле останется пустым и фокус перейдет к другому элементу, то текст-подсказка опять появится. Очень удобно.
Создайте новый класс TextBoxWithPrompt.cs и введите следующий код:
using System;
using System.Windows.Forms;
using System.Diagnostics;
using System.Drawing;
using System.ComponentModel;
public partial class TextBoxWithPrompt : TextBox
{
// originated at http://danielmoth.com/Blog
protected override void OnGotFocus(EventArgs e)
{
base.OnGotFocus(e);
if (this.UsePrompt)
{
this.UsePrompt = false;
this.Text = string.Empty;
}
}
protected override void OnLostFocus(EventArgs e)
{
if (this.TextLength == 0 || this.Text == this.TextPrompt)
{
this.UsePrompt = true;
this.Text = this.TextPrompt;
}
base.OnLostFocus(e);
}
private string textPrompt = "enter a moth";
public string TextPrompt
{
get { return textPrompt; }
set
{
textPrompt = value;
if (this.UsePrompt && !string.IsNullOrEmpty(this.textPrompt))
{
this.Text = value;
}
}
}
private bool usePrompt;
private bool UsePrompt
{
get { return usePrompt; }
set
{
usePrompt = value;
if (usePrompt)
{
this.Font = new Font(this.Font.Name, this.Font.Size, FontStyle.Italic);
this.ForeColor = Color.Gray;
}
else
{
// TODO don't hardcode the user given values.
this.Font = new Font(this.Font.Name, this.Font.Size, FontStyle.Regular);
this.ForeColor = Color.Black;
}
}
}
protected override void OnParentChanged(EventArgs e)
{
if (string.IsNullOrEmpty(this.Text))
{
this.UsePrompt = true;
this.Text = this.TextPrompt;
}
base.OnParentChanged(e);
}
public override string Text
{
get
{
if (this.UsePrompt)
{
return string.Empty;
}
return base.Text;
}
set
{
if (this.UsePrompt && (!string.IsNullOrEmpty(value) && value != this.TextPrompt))
{
this.UsePrompt = false;
}
if (string.IsNullOrEmpty(value) && !this.Focused && !string.IsNullOrEmpty(this.textPrompt))
{
this.UsePrompt = true;
this.Text = this.TextPrompt;
return;
}
base.Text = value;
}
}
}
Сохраните файл и постройте проект (Build Solution). Далее найдите на панели инструментов элемент TextBoxWithPromt и перетащите его на форму. Для текста-подсказки используйте свойство TextPromt. Автором идеи является Daniel Moth, который описал этот прием в своем блоге The Moth.
ListView
Градиентная заливка для выделенных элементов
Возможно, вы видели, что в Windows Mobile 6.5 многие программы, имеющие элемент ListView, для выделенных элементов используют градиентную заливку . Вы можете добиться такого же результата, если воспользуетесь сообщением Windows LVM_GETEXTENDEDLISTVIEWSTYLE со стилем LVS_EX_THEME
// Устанавливаем стиль темы для ListView
public static void SetThemeStyle(this ListView listView)
{
// Получим текущее состояние используемого стиля
int currentStyle = SendMessage(listView.Handle, (uint)LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);
// Применяем стиль LVS_EX_THEM
SendMessage(listView.Handle, (uint)LVM_SETEXTENDEDLISTVIEWSTYLE, 0, currentStyle | LVS_EX_THEME);
}
Фоновый рисунок для ListView
Вы можете установить фоновый рисунок для ListView при помощи сообщения LVM_SETBKIMAGE.
public static void SetBackgroundImage(this ListView listView, string path)
{
// Create bitmap
Bitmap bitmap = new Bitmap(path);
// Retrieve HBITMAP
IntPtr hBitmap = bitmap.GetHbitmap();
// Dispose the managed bitmap
bitmap.Dispose();
// Prepare structure
LVBKIMAGE lvImage = new LVBKIMAGE();
lvImage.hbm = hBitmap;
lvImage.ulFlags = LVBKIF_SOURCE_HBITMAP;
// Assign an image
SendMessage(listView.Handle, LVM_SETBKIMAGE, 0, ref lvImage);
}
Сетка для ListView
В своей книге Программирование для мобильных устройств под управлением Windows Mobile я рассказывал о том, как добавить сетку для ListView при помощи стиля LVS_EX_GRIDLINES. Для большего удобства этот пример добавлен в проект, объединяющий все три примера для ListView.
Вы можете скачать исходник, в котором применяются сразу три способа: установка фонового рисунка, сетки и использование градиента для выделенных элементов.
Источники: Для примеров использовались материалы с
Button
Реклама