"My cat, as it turns out, is an excellent debugger, and she has helped me solve a number of nasty bugs when I talked to her about them."
John Robbins, Debugging Applications, Microsoft Press, 2000
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */

Элементы управления

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.

TextBoxPrompt

ListView

Градиентная заливка для выделенных элементов

Возможно, вы видели, что в Windows Mobile 6.5 многие программы, имеющие элемент ListView, для выделенных элементов используют градиентную заливку . Вы можете добиться такого же результата, если воспользуетесь сообщением Windows LVM_GETEXTENDEDLISTVIEWSTYLE со стилем LVS_EX_THEME

Градиент для выделенных элементов ListView

	
// Устанавливаем стиль темы для 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

Сетка для ListView

В своей книге Программирование для мобильных устройств под управлением Windows Mobile я рассказывал о том, как добавить сетку для ListView при помощи стиля LVS_EX_GRIDLINES. Для большего удобства этот пример добавлен в проект, объединяющий все три примера для ListView.

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

Источники: Для примеров использовались материалы с A few tips on customizing ListView in WM 6.5 и A few more tips on customizing ListView

Button

Themed Image Button in .NETCF

Реклама