Главная » Разработка для Windows Phone 7 » События Manipulation

0

Интерфейс обработки сложного касания в Silverlight включает три события: ManipulationStarted, ManipulationDelta и ManipulationCompleted. Это события не занимаются отдельными касаниями, они консолидируют действия множества касаний в операции преобразования и масштабирования. Также они аккумулируют сведения о скорости, поэтому могут использоваться для реализации инерции, несмотря на то что не поддерживают ее напрямую.

будут рассмотрены более подробно далее в данной книге. В этой главе я применю ManipulationStarted просто для выявления контакта пальца с экраном, но не буду заниматься обработкой последующих действий.

Тогда как Touch.FrameReported обеспечивал данные касания для всего приложения, события Manipulation делают это для отдельных элементов. Таким образом, в SilverlightTapHello1 обработчик события ManipulationStarted может быть закреплен за TextBlock:

Проект Silverlight: SilverlightTapHello1 Файл: MainPage.xaml (фрагмент)

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <TextBlock Text="Hello, Windows Phone 7!" Padding="0 34"

HorizontalAlignment="Center" VerticalAlignment="Center"

ManipulationStarted="OnTextBlockManipulationStarted" />

</Grid>

Файл MainPage.xaml.cs включает такой обработчик события:

Проект Silverlight: SilverlightTapHello1 Файл: MainPage.xaml.cs (фрагмент)

public partial class MainPage : PhoneApplicationPage {

Random rand = new Random();

public MainPage() {

InitializeComponent();

}

void OnTextBlockManipulationStarted(object sender,

ManipulationStartedEventArgs args)

{

TextBlock txtblk = sender as TextBlock;

Color clr = Color.FromArgb(255, (byte)rand.Next(25 6),

(byte)rand.Next(256), (byte)rand.Next(25 6));

txtblk.Foreground = new SolidColorBrush(clr);

args.Complete();

}

}

Обработчик события получает элемент, формирующий это событие, из аргумента sender. Им всегда будет TextBlock. Сведения о TextBlock также доступны из свойства args.OriginalSource и свойства args.ManipulationContainer.

Обратите внимание на вызов метода Complete (Завершить) аргументов события в конце. Он не является обязательным, но эффективен для уведомления системы о том, что в дальнейшем события Manipulation для обработки этого касания не нужны.

Данная программа некорректна. Если выполнить ее, можно заметить, что она работает только частично. Прикосновение к TextBlock меняет цвет текста случайным образом. Но если коснуться вне TextBlock, цвет не возвращается к исходному белому. Поскольку это событие было задано для TextBlock, обработчик события вызывается, только когда пользователь касается TextBlock. Программа не обрабатывает никаких других событий Manipulation.

Приложение, удовлетворяющее моим исходным техническим условиям, должно обрабатывать все события касания страницы. Обработчик события ManipulationStarted должен быть определен для MainPage, а не только для TextBlock.

Хотя, безусловно, этот вариант возможен, но существует более простой способ. Класс UIElement определяет все события Manipulation. Но класс Control (от которого наследуется MainPage) дополняет эти события защищенными виртуальными методами. Можно не задавать обработчик события ManipulationStarted в MainPage, а просто перегрузить виртуальный метод OnManipulationStarted (Когда обработка началась).

Такой подход реализован в проекте SilverlightTapHello2. Файл XAML не обрабатывает никакие события, но задает имя для TextBlock, которое может использоваться в коде:

Проект Silverlight: SilverlightTapHello2 Файл: MainPage.xaml (фрагмент)

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <TextBlock Name="txtblk"

Text="Hello, Windows Phone 7!" Padding="0 34"

HorizontalAlignment="Center" VerticalAlignment="Center" />

</Grid>

Класс MainPage перегружает метод OnManipulationStarted:

Проект Silverlight: SilverlightTapHello2 Файл: MainPage.xaml.cs (фрагмент)

public partial class MainPage : PhoneApplicationPage {

Random rand = new Random(); Brush originalBrush;

public MainPage() {

InitializeComponent(); originalBrush = txtblk.Foreground;

}

protected override void OnManipulationStarted(ManipulationStartedEventArgs args) {

if (args.OriginalSource == txtblk) {

txtblk.Foreground = new SolidColorBrush(

Color.FromArgb(255, (byte)rand.Next(25 6), (byte)rand.Next(256), (byte)rand.Next(256)));

}

else {

txtblk.Foreground = originalBrush;

}

args.Complete();

base.OnManipulationStarted(args);

}

}

В ManipulationStartedEventArgs (Аргументы события обработка началась) свойство OriginalSource (Первоначальный источник) указывает на источник события, т.е. на расположенный поверх всех остальных элемент, которого касается пользователь. Если значение этого свойства равно txtblk, метод создает случайный цвет для свойства Foreground. Если нет, свойство Foreground возвращается к исходному цвету.

В этом методе OnManiulationStarted обрабатываются события MainPage, но свойство OriginalSource показывает, что фактически событие произошло в элементе, расположенном ниже в визуальном дереве. Это так называемая возможность обработки маршрутизированных событий в Silverlight.

Источник: Чарльз Петзольд, Программируем Windows Phone 7, Microsoft Press, © 2011.

По теме:

  • Комментарии