воскресенье, 29 июля 2012 г.

Прозрачный ListBox в приложении Windows Phone

Чтобы в Silverlight приложении для Windows Phone сделать ListBox програчным, например, для того, чтобы список отображался на фоне иллюстрации, в XAML файл страницы, содержащейListBox, надо добавить объявление стиля для ListBox (за прозрачность отвечает параметр Backgroundузла ScrollViever) и затем указать этот стиль в качестве значения параметра Style.

Пример объявлени стиля:

<Style x:Key="ListBoxStyle1" TargetType="ListBox">
<SetterProperty="Background" Value="Transparent"/>
<SetterProperty="Foreground" Value="{StaticResource PhoneForegroundBrush}"/>
<SetterProperty="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled"/>
<SetterProperty="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
<SetterProperty="BorderThickness" Value="0"/>
<SetterProperty="BorderBrush" Value="Transparent"/>
<SetterProperty="Padding" Value="0"/>
<SetterProperty="Template">
<Setter.Value>
<ControlTemplateTargetType="ListBox">
<ScrollViewerx:Name="ScrollViewer" BorderBrush="{TemplateBindingBorderBrush}"BorderThickness="{TemplateBinding BorderThickness}" Background="Transparent " Foreground="{TemplateBindingForeground}"Padding="{TemplateBinding Padding}" >
<ItemsPresenter/>
</ScrollViewer>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

КомпонентListBox:
<ListBox Height="535" HorizontalAlignment="Left" x:Name="listBox1" VerticalAlignment="Top" Width="456" ItemTemplate="{StaticResourceDataTemplate1}" ItemsSource="{Binding}" ManipulationStarted="Canvas_ManipulationStarted" ManipulationCompleted="Canvas_ManipulationCompleted" Style="{StaticResourceListBoxStyle1}" />

суббота, 28 июля 2012 г.

LINQ в приложениях Windows Phone

LINQ в приложениях Windows Phone

В приложении для Windows Phone альтернативой простой базе данных Microsoft SQL Server Compact Edition может быть список записей. В этом случае для обработки списка (сортировки, поиска элемента, выборки данных)  удобно  использовать технологию LINQ.

Пусть есть список:
class task
{
      public string Title { get; set; }
      public DateTime Date { get; set; }

      public task(string title, DateTime date)
      {
          Title = title;
          Date = date;
      }
}
     
List<task> list = new List<task>(); // список записей

Следующий фрагмент кода показывает, как можно выполнить сортировку списка и выбрать данные из списка.
// добавить элементы в список
                list.Add(new task("Стрижка газона", new DateTime(2012, 7, 15)));
                list.Add(new task("Фитнес", new DateTime(2012, 7, 12)));
                list.Add(new task("Теннис", new DateTime(2012, 7, 7)));
                list.Add(new task("Прополка огурцов", new DateTime(2012, 7, 5)));
                list.Add(new task("Сбор ягод", new DateTime(2012, 7, 1)));

                // показать исходный список
                listBox1.Items.Add("Sourse list:");
                foreach (task t in list)
                {
                    listBox1.Items.Add(t.Date.ToShortDateString() + ", " + t.Title);
                }
                listBox1.Items.Add(" ");

                // сортировка 1 - по дате
                IEnumerable<task> sorted = list.OrderBy(n => n.Date);

                // показать отсортированный список
                listBox1.Items.Add("Sorted list 1:");
                foreach (task t in sorted)
                {
                    listBox1.Items.Add(t.Date.ToShortDateString() + ", " + t.Title);
                }
                listBox1.Items.Add(" ");


                // сортировка 2 - по алфавиту
                IEnumerable<task>sorted2 = list.OrderBy(n => n.Title);

                // показать отсортированный список
                listBox1.Items.Add("Sorted list 2:");
                foreach (task t in sorted2)
                {
                    listBox1.Items.Add(t.Date.ToShortDateString() + ", " + t.Title);
                }
                listBox1.Items.Add(" ");


                // выборка элементов
                DateTime t1 = new DateTime(2012, 7, 5);
                DateTime t2 = new DateTime(2012, 7, 12);

                // выбрать из отсортированного списка элементы, принадлежащие диапазону [t1,t2]
                IEnumerable<task> selected = sorted.Where(n => ((n.Date >= t1) && (n.Date <= t2)));

                // показать выбранные элементы
                listBox1.Items.Add("Selected items:");
                foreach (task t in selected)
                {
                    listBox1.Items.Add(t.Date.ToShortDateString() + "," + t.Title);
                }
                listBox1.Items.Add(" ");

четверг, 19 июля 2012 г.

WP7 Usercontrol - методика создания компонента программиста

Программист может создать элемент управления или, как часто говорят, компонент и использовать его в своих программах также, как и другие стандартные компоненты.
Процесс создания компонента состоит из следующих этапов:
·         создание и тестирование прототипа компонента
·         создание сборки (dll библиотеки), содержащей компонент
·         установка компонента (сборки)

Создание и тестирование прототипа компонента


Чтобы создать прототип компонента (класс компонента), надо создать новый проект и добавить в него Windows Phone Usercontrol (команда Project > Add New Item > Windows Phone Usercontrol). В момент добавления  Windows Phone Usercontrol в проект, в качестве имени компонента следует указать предполагаемое имя класса компонента. Например, если создаваемый компонент представляет собой календарь на месяц, то вполне логично назвать класс calendar.
После того как Windows Phone Usercontrol будет добавлен в проект, надо открыть соответствующий этому элементу XAML-файл и поместить в поле элемента управления необходимые компоненты, а в cs-файл – инструкции, реализующие функциональность элемента управления.  
После этого надо выполнить компиляцию проекта.
В результате компиляции проекта (модуля компонента) в Toolbox должен появиться значек созданного компонента.

Созданный компонент надо поместить на страницу приложения, настроить, выполнить компиляцию проекта и убедится, что компонент работает правильно.

В качестве примера на рис. приведен вид компонента NumberBox, в листенге – код класса компонента.

Вид страницы приложения использующего компонент приведен на рис. .

Создание сборки


Существует два подхода к повторному использованию кода. Первый заключается в том, что в созданный ранее исходный код  (XAML- и cs- файлы ) включается в проект. Второй подход предполагает создание библиотеки (dll-файл), содержащей выполняемы код (класс), и включении этой библиотеки в проект.

Процесс создания библиотеки (сборки), содержащей класс компонента программиста, состоит из следующих шагов:
·         Создать проект Windows Phone Class Library. В качестве имени проекта следует указать предполагаемое имя dll-файла и, как следствие, пространства имен, которому будет принадлежать компонент, например, nkcontrols (здесь nk – Nikita Kultin).
·         Добавить в проект класс компонента: выбрать команду Project > Add Exsisting Item, открыть папку, в которой находится класс компонента и указать XAML-файл.
·         Удалить из проекта файл Class1.css
·         Открыть страницу свойств проекта, сделать щелчок на на кнопке Assembly Information и ввести описание сборки – заполнить поля Description, Copyright и т.д..
·         Выполнить компиляцию проекта.

В результате описанных действий в bin папке проекта будет создан dll-файл – библиотека, содержащая компонент.

Установка компонента


Для того, чтобы компонент (класс), находящийся в dll-файле, стал доступен (появился на Toolbox),  надо:

·         в контекстном меню Toolbox выбрать команду Choose Items

·         в появившемся окне открыть папку, в которой находится dll-файл, содержащий компонент (класс) и выбрать его

 В результате описанных действий на Toolbox должен появиться значок компонента.

воскресенье, 8 июля 2012 г.

Windows Phone - вид клавиатуры


В Silverlight приложении для Windows Phone в результате перемещения фокуса на элемент управления, предназначенный для ввода текста (TextBox), на экране автоматически появляется алфавитная клавиатура, что не всегда удобно для пользователя. 
Программист может задать тип клавиатуры, которая будет появляться на экране при получении форуса элементом управления. Для этого в XAML файле надо установить значение параметра InputScope компонента TextBox. В качестве значения параметра следует использовать одну из приведенных в таблице констант.

SIP layout
XAML or enumeration value
SIP description
Default
Default, and other standard input scope values
Standard QWERTY layout
Text
Text
Standard layout with features such as autocorrect and text suggestion
Web
Url
Standard layout with .com and customized Enter key for typing URLs.
E-mail address
EmailSmtpAddress
Standard layout with .com and @ key.
E-mail name or address
EmailNameOrAddress
Standard layout with .com and @ key, and easy access to phone number layout.
Maps
Maps
Standard layout with a customized Enter key. Used to type a location to search for on a map
Phone number
TelephoneNumber
12-key layout
Search
Search
Semi-transparent layout with a Search and .com key.
SMS contact
NameOrPhoneNumber
Standard layout with access to phone number layout. Used to type in the SMS To field
Chat
Chat
Text input that uses intelligent features such as abbreviations
Number

Пример:

<TextBox Height="72" HorizontalAlignment="Left" Margin="263,284,0,0" Name="textBox2" Text="" VerticalAlignment="Top" Width="78" KeyDown="TextBox_KeyDown" TextAlignment="Center" InputScope="Number"/>

Windows Phone - ввод числа в поле редактирования

Если в Silvertlight приложении для Windows Phone надо сделать так, чтобы в поле редактирования (TextBox) пользователь мог ввести только целое число,  то надо написать функцию обработки события KeyUp, которая будет проверять на допустимость символ, соответствующий нажатой клавише, и, если символ неверный (не цифра), корректировать содержимое поля редактирования. Приведенный ниже код показывает, как это сделать.

// (с) Никита Культин, 2012. http://kultin/ru
// Фильтр ввода. В поле редактирование можно ввести только целое
       // положительное число не больше 31.
private void textBox2_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Back) return;
            int ss = textBox2.SelectionStart;
            string buf = textBox2.Text;
            char ch = buf[ss-1];

            if (!Char.IsDigit(ch))
            {
                // здесь введенный символ не цифра
                int p = buf.IndexOf(ch);
                string s1, s2;
                s1 = buf.Substring(0, p);
                s2 = buf.Substring(p + 1);
                textBox2.Text = s1 + s2;
                textBox2.SelectionStart = textBox2.Text.Length;
            }
            else
            {
                // здесь символ цифра, т.е. формально правильный,
                // но возможно превышение допустимого значения
                int n = System.Convert.ToInt32(textBox2.Text);
                if (n > 31)
                {
                    // удалить введенный символ
                    int p = buf.IndexOf(ch);
                    string s1, s2;
                    s1 = buf.Substring(0, p);
                    s2 = buf.Substring(p + 1);
                    textBox2.Text = s1 + s2;
                    textBox2.SelectionStart = textBox2.Text.Length;
                }
            }
        }