Главная » Разработка для Windows Phone 7 » Обработка событий манипуляций Windows Phone 7

0

Трансформации также являются хорошим способом обработки событий манипуляций. В данном фрагменте описан мяч, располагающийся в центре сетки для содержимого:

Проект Silverlight: DragAndScale Файл: Page.xaml

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <Ellipse Width="200" Height="2QQ"

RenderTransformOrigin="0.5 0.5"

ManipulationDelta="OnEllipseManipulationDelta"> <Ellipse.Fill>

<RadialGradientBrush Center="0.4 0.4"

GradientOrigin="0.4 0.4"> <GradientStop Offset="0" Color="White" />

<GradientStop Offset="1" Color="{StaticResource PhoneAccentColor}"

/>

</RadialGradientBrush> </Ellipse.Fill>

<Ellipse.RenderTransform>

<CompositeTransform /> </Ellipse.RenderTransform> </Ellipse> </Grid>

Обратите внимание на CompositeTransform. У этого класса нет имени, поэтому в коде на него придется ссылаться через элемент Ellipse. (Такая стратегия хороша в случае использования одного обработчика события для нескольких элементов.)

В файле выделенного кода обрабатывается только событие ManipulationDelta от Ellipse:

void OnEllipseManipulationDelta(object sender, ManipulationDeltaEventArgs args) {

Ellipse ellipse = sender as Ellipse;

CompositeTransform xform = ellipse.RenderTransform as CompositeTransform; if (args.DeltaManipulation.Scale.X > 0 || args.DeltaManipulation.Scale.Y > 0)

double maxScale                   = Math.Max(args.DeltaManipulation.Scale.X,

args.DeltaManipulation.Scale.Y);

xform.ScaleX *=                   maxScale;

xform.ScaleY *=                   maxScale;

}

xform.TranslateX +=               args.DeltaManipulation.Translation.X;

xform.TranslateY +=               args.DeltaManipulation.Translation.Y;

args.Handled = true;

}

Событие ManipulationDelta играет критически важную роль при обработке любых манипуляций, сложнее чем одиночное касание. Это событие консолидирует сведения об одном или более касании элемента в данные трансформации переноса и масштабирования. Класс ManipulationDeltaEventArgs (Аргументы события приращения в ходе манипуляции) включает два свойства: CumulativeManipulation (Совокупная манипуляция) и DeltaManipulation (Манипуляция приращением). Оба эти свойства типа ManipulationDelta, у которого есть два свойства: Translation (Перенос) и Scale (Масштаб).

Зачастую использовать DeltaManipulation проще, чем CumulativeManipulation. Если манипуляции с элементом осуществляются посредством касания в одной точке, действительные значения имеют только коэффициенты Translation, и они могут быть использованы только как значения TranslateX и TranslateY свойств класса CompositeTransform. Если касание экрана происходит одновременно в двух точках, значения Scale отличны от нуля. Они могут быть отрицательными и часто неодинаковые. Чтобы круг оставался кругом, я использую максимальное из этих значений и умножаю его на существующие коэффициенты масштабирования трансформации. Так реализовываются операции «сведение» и «растяжение».

XAML-файл устанавливает центр трансформации в центре эллипса. Теоретически он должен определяться на основании положения и перемещений двух касаний, но это довольно сложная задача.

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

По теме:

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