Что такое Behavior?
На Mix 09 парни из Microsfot показывали 3-й Expression Blend, который уже можно скачать и установить (ставится на ура рядом со вторым блендом). В новом бленде появилась возможность создавать Behaviors - поведения. Сложно сказать конкретно, что такое "поведение", т.к. оно может быть чем угодно :). Поведения наделяют объект каким-либо свойством. Например, на презентации длиною в 18 минут, Pete Blois дает возможность кнопкам:
- Соответствовать законам физики: при запуске приложения кнопки начинают падать.
- Обладать свойством перетаскивабельности: можно потянуть кнопку мышкой. А т.к. кнопка еще и действует по законам физики, вы получите некоторое последействие, когда отпустите мышку. Кнопка поедет чуточку дальше :).
- Обладать магнетизмом: кнопка начинает притягивать другие объекты :).
Поведения работают как в Silverlight 3.0, так и в WPF. В Preview версии Blend'a нет стандартных поведений:
но, на сайте Microsoft Expression Community Gallery, уже можно скачать те поведения, что использовал Pete в своей презентации :).
Как создать свое поведение?
Здесь приводится алгоритм создания своего поведения на примере DragBehavior'a, наделяющего объект свойством перетягивабельности :).
1. Для начала стоит поставить третий бленд :).
2. Создаем новый Silverlight Project (с равным успехом, можно создавать WPF проект, но пример мы сделаем на Silverlight'e).
3. В References нашего Silverlight приложения добавляем сборку "Microsoft.Expression.Interactivity.dll" (по умолчанию, она находится в папке "C:\Program Files\Microsoft Expression\Blend 3 Preview\Libraries") :
4. Теперь нам нужно определить новый класс поведения. Поскольку я ленивый, сделаю это прямо в файле с Code behind'ом для моего Entry Point'a в приложение. После редактирования, он выглядит так:
using System.Windows; using System.Windows.Controls; using System.Windows.Input; using Microsoft.Expression.Interactivity; namespace SilverlightApplication1 { public partial class MainControl : UserControl { public MainControl() { // Required to initialize variables InitializeComponent(); } } public class DragBehavior : Behavior<UIElement> { private bool _isDragging = false; private Point _prevPoint; protected override void OnAttached() { AssociatedObject.MouseLeftButtonDown += AssociatedObject_MouseLeftButtonDown; AssociatedObject.MouseMove += AssociatedObject_MouseMove; AssociatedObject.MouseLeftButtonUp += AssociatedObject_MouseLeftButtonUp; } void AssociatedObject_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { _isDragging = false; AssociatedObject.ReleaseMouseCapture(); } void AssociatedObject_MouseMove(object sender, MouseEventArgs e) { if (!_isDragging) { return; } var currentPoint = e.GetPosition(null); var left = Canvas.GetLeft(AssociatedObject) + currentPoint.X - _prevPoint.X; var top = Canvas.GetTop(AssociatedObject) + currentPoint.Y - _prevPoint.Y; Canvas.SetLeft(AssociatedObject, left); Canvas.SetTop(AssociatedObject, top); _prevPoint = currentPoint; } void AssociatedObject_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { _isDragging = true; _prevPoint = e.GetPosition(null); AssociatedObject.CaptureMouse(); } } }
Как видите, новое поведение наследуется от Generic-класса "Behavior". В качестве параметра шаблона мы передаем UIElement, именно к такого типа элементам применимо наше поведение. Единственное ограничение на параметр шаблона: он обязательно должен быть DependencyObject'ом (Почему? - Читайте в следующем посте)
Мы также перекрыли вызов метода "OnAttached()", что произойдет, когда наше поведение будет присоединено к UIElement'у. Сам UIElement доступен через свойство "AssociatedObject". Имея в распоряжении полный доступ к элементу, мы подписываемся на его события мышки, и при зажатой левой кнопке меняем координаты Canvas.Left, Canvas.Top. Конечно, это накладывает ограничения: чтобы пример заработал, нужно положить UIElement в Canvas.
5. Скомпилируем проект, и пойдем в Asset Library. На вкладке Behaviors мы найдем наше поведение:
6. Теперь, имея следующую разметку нашего Root Visual'a:
<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="SilverlightApplication1.MainControl" Width="640" Height="480"> <Grid x:Name="LayoutRoot" Background="White"> <Canvas> <Rectangle Fill="Green" Width="40" Height="40"/> </Canvas> </Grid> </UserControl>
Мы можем перетащить DragBehavior на Rectangle. После этого, наш Rectangle получает... присоединенное DependencyProperty: Interaction.Behaviors:
<Rectangle Fill="Green" Width="40" Height="40"> <i:Interaction.Behaviors> <local:DragBehavior/> </i:Interaction.Behaviors> </Rectangle>
7. Запустив приложение, мы сможем возькать мышкой прямоугольник.
Как работают поведения?
Об этом читайте в следующем посте :).
Комментариев нет:
Отправить комментарий