Ein neues Feature von Silverlight sind Behaviors. Dieses Feature wurde von WPF abgeguckt. Das schöne daran ist … diese WPF Behaviors können nahezu 1:1 wieder verwendet werden. Aber mal der Reihe nach.

Was sind Behaviors?

Behaviors sind eine Art von Verhalten, welches man einem Element nachträglich geben kann. Mittels Blend geht dies sogar ohne Programmieren, einfach durch Drag&Drop. Das folgende Bild zeigt die neue Asset-Bibliothek in Blend 3.

image

Um ein Behavior auf ein Element anzuwenden, zieht man dieses einfach per Drag&Drop aus der Asset-Library auf das entsprechende Control.

image

Und schon hat das Control (_imageGrid) die Mouse3DBehavior-Eigenschaften.

Anbei der Code für das Mouse3DBehavior, welches ich in meiner kleinen Bildergalerie verwende. Damit läßt sich nun jedes Control mit der Maus dreidimensional Bewegen. Einfach die linke Maustaste drücken und die Maus bewegen.

image

Anbei der Code für das Mouse3DBehavior.

   1: public class Mouse3DBehavior : Behavior<UIElement>
   2: {
   3: PlaneProjection _planeProjection;
   4: bool _buttonPressed = false;
   5: Point _originPoint;
   6:  
   7: protected override void OnAttached()
   8: {

 

   9:     base.OnAttached();
  10:  
  11:     _planeProjection = new PlaneProjection();
  12:     this.AssociatedObject.Projection = _planeProjection;
  13:  
  14:     (new MouseWheelHelper(this.AssociatedObject as FrameworkElement)).Moved += new System.EventHandler<MouseWheelEventArgs>(Mouse3DBehavior_Moved);
  15:  
  16:     this.AssociatedObject.MouseLeftButtonDown += new MouseButtonEventHandler(AssociatedObject_MouseLeftButtonDown);
  17:     this.AssociatedObject.MouseLeftButtonUp += new MouseButtonEventHandler(AssociatedObject_MouseLeftButtonUp);
  18:     this.AssociatedObject.MouseMove += new MouseEventHandler(AssociatedObject_MouseMove);
  19:     this.AssociatedObject.MouseLeave += new MouseEventHandler(AssociatedObject_MouseLeave);
  20:  
  21:     this.AssociatedObject.KeyUp += new KeyEventHandler(AssociatedObject_KeyUp);
  22:     this.AssociatedObject.KeyDown += new KeyEventHandler(AssociatedObject_KeyDown);
  23: }
  24:  
  25: bool _shiftPressed = false;
  26:  
  27: void AssociatedObject_KeyDown(object sender, KeyEventArgs e)
  28: {
  29:     if (e.Key == Key.Shift)
  30:     {
  31:         _shiftPressed = true;
  32:     }
  33: }
  34:  
  35: void AssociatedObject_KeyUp(object sender, KeyEventArgs e)
  36: {
  37:     _shiftPressed = false;
  38: }
  39:  
  40: void Mouse3DBehavior_Moved(object sender, MouseWheelEventArgs e)
  41: {
  42:     if (_buttonPressed)
  43:     {
  44:         _planeProjection.LocalOffsetZ += e.Delta * 10;
  45:         this.AssociatedObject.Projection = _planeProjection;
  46:     }
  47: }
  48:  
  49: void AssociatedObject_MouseLeave(object sender, MouseEventArgs e)
  50: {
  51:     _buttonPressed = false;
  52: }
  53:  
  54: void AssociatedObject_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  55: {
  56:     _originPoint = GetPoint(e);
  57:     _buttonPressed = true;
  58: }
  59:  
  60: void AssociatedObject_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
  61: {
  62:     _buttonPressed = false;
  63: }
  64:  
  65: void AssociatedObject_MouseMove(object sender, MouseEventArgs e)
  66: {
  67:     if (_buttonPressed)
  68:     {
  69:         Point p = GetPoint(e);
  70:  
  71:         double diffX = p.X - _originPoint.X;
  72:         double diffY = p.Y - _originPoint.Y;
  73:  
  74:         _planeProjection.RotationY += diffX / 10;
  75:         _planeProjection.RotationX += diffY / 10;
  76:         this.AssociatedObject.Projection = _planeProjection;
  77:  
  78:         _originPoint = p;
  79:     }
  80: }
  81:  
  82: private Point GetPoint(MouseEventArgs e)
  83: {
  84:     return e.GetPosition(this.AssociatedObject);
  85: }
  86:  
  87: protected override void OnDetaching()
  88: {
  89:     base.OnDetaching();
  90:  
  91:     this.AssociatedObject.Projection = null;
  92:  
  93:     this.AssociatedObject.MouseLeftButtonDown -= new MouseButtonEventHandler(AssociatedObject_MouseLeftButtonDown);
  94:     this.AssociatedObject.MouseLeftButtonUp -= new MouseButtonEventHandler(AssociatedObject_MouseLeftButtonUp);
  95:     this.AssociatedObject.MouseMove -= new MouseEventHandler(AssociatedObject_MouseMove);
  96: }

Damit das ganze funktioniert muss man noch die Microsoft.Expression.Interactivity bzw. System.Windows.Interactivity einbinden. Diese liegt in einem Unterordner von Expression bzw. dem SDK.