Placeholder

Посещая различные ресурсы сети Интернет, каждый из нас практически постоянно сталкивается с полями, которые по умолчанию заполнены определенным текстом, например, образцом заполнения полей для ввода логина или пароля. Все поля, которые предварительно заполнены текстом-подсказкой, имеют светло-серый цвет. Если пользователь щелкает в этом поле, текст исчезает, и он может вводить текст. Данные поля очень удобны для пользователей: во-первых, они позволяют пользователю визуально различать заполненные и незаполненные поля, что делает работу с ресурсом более удобной — для этого используется цветовая гамма. Во-вторых, определяется формат ввода данных в выбранное поле, что обеспечивает быстроту работы с ресурсом — пользователь не тратит время на повторный ввод данных — ошибится форматом практически не возможно.
Реализовать данные поля возможно не только в верстке веб-ресурсов, существует и возможность реализации в Windows Phone 7. Код, реализующий данную функцию, представлен ниже. Наличие текста-подсказки определяется с помощью выставления атрибута TextBoxText.

xmlns:controls="clr-namespace:WatermarkTextBox"
...
<controls:WatermarkTextBox WatermarkText="Введите Ваш e-mail" />


public class WatermarkTextBox : TextBox
{
public string WatermarkText
{
get { return (String)this.GetValue(WatermarkTextProperty); }
set { this.SetValue(WatermarkTextProperty, value); }
}
public static readonly DependencyProperty WatermarkTextProperty =
DependencyProperty.Register("WatermarkText", typeof(String), typeof(WatermarkTextBox), new PropertyMetadata(String.Empty));

public SolidColorBrush WatermarkForeGroundColor = Application.Current.Resources["PhoneTextBoxReadOnlyBrush"] as SolidColorBrush;

public WatermarkTextBox()
{
Loaded += new RoutedEventHandler(WatermarkTextBox_Loaded);
}

void WatermarkTextBox_Loaded(object sender, RoutedEventArgs e)
{
this.Text = !String.IsNullOrEmpty(WatermarkText) ? WatermarkText : String.Empty;
this.Foreground = WatermarkForeGroundColor;
}

protected override void OnGotFocus(RoutedEventArgs e)
{
base.OnGotFocus(e);

if (WatermarkText == this.Text)
{
this.Text = String.Empty;
this.Foreground = Application.Current.Resources["PhoneTextBoxForegroundBrush"] as SolidColorBrush;
}
}

protected override void OnLostFocus(RoutedEventArgs e)
{
base.OnLostFocus(e);

if (String.IsNullOrEmpty(this.Text))
{
this.Text = !String.IsNullOrEmpty(WatermarkText) ? WatermarkText : String.Empty;
this.Foreground = WatermarkForeGroundColor;
}
}
}

Listpicker в Windows Phone 7

Windows Phone 7 — это современная мобильная операционная система от Microsoft. Особенностью данной ОС является наличие нового ядра Windows CE, новый уровень API и GUI. GUI Windows Phone 7 требует написание приложений на SilverLight/XNA. В данной статье я расскажу Вам о применении контрола Listpicker для создания максимально удобных приложений под Windows Phone 7.

ListPicker это один из контролов в Silverlight Toolkit для Windows Phone 7. Он предназначен для выбора какого-либо пункта из списка. Данный элемент очень похож на Combobox, но имеет значительно больше возможностей, чем ComboBox. Например, если необходимо отобразить список небольшой длины, то ListPicker покажет данные в виде Combobox-а (описывается свойством ItemTemplate и используется в тот момент, когда отображается один выбранный элемент из списка, т.е. контрол не активен), а если необходимо отобразить большее число позиции списка, то Listpicker покажет данные в виде ListBox-а (задается параметром FullModelItemTemplate и используется при выборе пользователя из всего списка, т.е. когда контрол ListPicker активен). Выбор формы отображения происходит автоматически. Именно поэтому, данный элемент управления очень удобно использовать. Преобразовать использованные в уже написанных приложениях ListBox-ы в ListPicker-ы очень легко — достаточно просто заменить название контрола в xaml файле с ListBox на ListPicker.

Создадим простое приложение на Microsoft Silverlight.
Для этого запускаем среду разработки и создаем новый проект Windows Phone Application Project.

Далее щелкните правой кнопкой мыши на References -> выберите Add Refrences -> и выберите Microsoft.Phone.Controls.Toolkit:

Затем, выбираем MainPage.xaml и происходит построение интерфейса пользователя, но для использования Microsoft.Phone.Controls.Toolkit необходимо после этого в нем объявлить

xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"

Теперь добавим несколько контролов на главную страницу: TextBlock, TextBox и ListPicker:

Для использования ListPicker мы должны определить ItemTemplate и FullModeItemTemplate:

<phone:PhoneApplicationPage.Resources>
        <DataTemplate x:Name="lpkItemTemplate">
            <TextBlock Text="{Binding Country}" />
        </DataTemplate>
        <DataTemplate x:Name="lpkFullItemTemplate">
            <TextBlock Text="{Binding Country}" />
        </DataTemplate>
    </phone:PhoneApplicationPage.Resources>

Полный код XAML:

<phone:PhoneApplicationPage
    x:Class="ListPickerDemo.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
    xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    shell:SystemTray.IsVisible="True">
    <phone:PhoneApplicationPage.Resources>
        <DataTemplate x:Name="lpkItemTemplate">
            <TextBlock Text="{Binding Country}" />
        </DataTemplate>
        <DataTemplate x:Name="lpkFullItemTemplate">
           <TextBlock Text="{Binding Country}" />
        </DataTemplate>
    </phone:PhoneApplicationPage.Resources>
    <!--LayoutRoot is the root grid where all page content is placed-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <!--TitlePanel contains the name of the application and page title-->
        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
            <TextBlock x:Name="ApplicationTitle" Text="MY APPLICATION" Style="{StaticResource PhoneTextNormalStyle}"/>
            <TextBlock x:Name="PageTitle" Text="ListPicker" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
        </StackPanel>
        <!--ContentPanel - place additional content here-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <TextBlock Text="Name" Margin="14,0,0,0"/>
            <TextBox Grid.Row="1" Name="txtName"/>
            <TextBlock Text="Ages " Grid.Row="2" Margin="14,0,0,0"/>
            <TextBox Name="txtAge" Grid.Row="3"/>
            <TextBlock Text="Country" Grid.Row="4" Margin="14,0,0,0" />
            <toolkit:ListPicker FullModeItemTemplate="{Binding lpkFullItemTemplate}"
                Grid.Row="5" ItemTemplate="{Binding lpkItemTemplate}"
                x:Name="lpkCountry"/>
            <Button Content="Submit" Grid.Row="5" Height="72" HorizontalAlignment="Left" Margin="284,87,0,0" Name="btnSubmit" Click="btnSubmit_Click"
             VerticalAlignment="Top" Width="160" />
        </Grid>
    </Grid>
</phone:PhoneApplicationPage>

Затем переходим к MainPage.xaml.cs и задаем массив строк в качестве примера данных, а также добавляем для ListPicker свойства ItemSource:

C # код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
namespace ListPickerDemo
{
    public partial class MainPage : PhoneApplicationPage
    {
        String[] Country = { "Viet Nam","Japan",
                              "China","USA",
                              "Poland","Brazil",
                         "Singapore","Philipin","Malaysia"};
        public MainPage()
        {
            InitializeComponent();
            this.lpkCountry.ItemsSource = Country;
        }
        private void btnSubmit_Click(object sender, RoutedEventArgs e)
        {
            String _Content = String.Format("Name: {0} \nAges: {1}\nCountry: {2}", txtName.Text,txtAge.Text,lpkCountry.SelectedItem);
            MessageBox.Show(_Content);
        }
    }
}

Теперь мы запускаем приложение для просмотра результата:

Если у вас небольшое число стран:

И если у вас длинный список стран (будет работать FullModeItemTamplate):

И после подтверждения формы:

Данный контрол очень удобен для использования практически во всех приложениях: для создания рубрицированного каталога книг электронной библиотеки, библиотеки аудиоплеера, для удобства заполнения форм регистрации и так далее. Применение ListPicker-а, несомненно, делает интерфейс приложения более удобным для пользователя и снижает время, затрачиваемое на выбор параметров. Простота применения и модификации позволяют использовать данный контрод программисту любого уровня — от новичка до профессионала.