2011-05-23 91 views
0

嗨 有一個在下面的代碼 行爲我想在我的WPF應用程序 使用這種行爲,但我不能連接這個行爲我的項目如何在Expression Blend中添加行爲

using System; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Ink; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 
using System.Windows.Interactivity; 
using System.ComponentModel; 

namespace Brainsiders.MouseOver3D 
{ 
    [Description("MouseOver3D - A behavior that applies the MouseOver Design Interaction Pattern to a 3D environment.")] 
    public class MouseOver3D : TargetedTriggerAction<FrameworkElement> 
    {   
     private TimeSpan hoverUp_duration = TimeSpan.FromSeconds(0.5); 
     [Category("Mouse Over 3D - Going Up")] 
     public TimeSpan HoverUp_duration 
     { 
      get { return hoverUp_duration; } 
      set { hoverUp_duration = value; } 
     } 
     private TimeSpan hoverDown_Duration = TimeSpan.FromSeconds(0.9); 
     [Category("Mouse Over 3D - Going Down")] 
     public TimeSpan HoverDown_Duration 
     { 
      get { return hoverDown_Duration; } 
      set { hoverDown_Duration = value; } 
     } 
     [Category("Mouse Over 3D - Going Up")] 
     public IEasingFunction HoverUp_Easing { get; set; } 
     [Category("Mouse Over 3D - Going Down")] 
     public IEasingFunction HoverDown_Easing { get; set; } 
     private double hoverOffset = 30; 
     [Category("Mouse Over 3D - General")] 
     public double HoverOffset 
     { 
      get { return hoverOffset; } 
      set { hoverOffset = value; } 
     } 
     private FrameworkElement feAssociatedObject; 
     private FrameworkElement feSourceObject; 
     private FrameworkElement feTargetObject; 
     private PlaneProjection ProjectionTargetObject; 
     private Storyboard SB_HoverZ; 
     protected override void Invoke(object parameter) 
     { 
      FrameworkElement myElement = this.AssociatedObject as FrameworkElement; 
     } 
     protected override void OnAttached() 
     { 
      base.OnAttached(); 
      feAssociatedObject = (FrameworkElement)this.AssociatedObject; 
      feSourceObject = (FrameworkElement)this.AssociatedObject; 
      feSourceObject.Loaded += new RoutedEventHandler(feSourceObject_Loaded); 
     } 
     void feSourceObject_Loaded(object sender, RoutedEventArgs e) 
     { 
      feSourceObject.Loaded -= new RoutedEventHandler(feSourceObject_Loaded); 
      ProjectionTargetObject = new PlaneProjection(); 
      feTargetObject = (FrameworkElement)this.TargetObject; 
      if (feTargetObject == null) feTargetObject = feAssociatedObject; 
      if (feTargetObject.Projection == null) 
      { 
       feTargetObject.RenderTransformOrigin = new Point(0.5, 0.5); 
       PlaneProjection pj = new PlaneProjection(); 
       feTargetObject.Projection = pj; 
      } 
      feSourceObject.MouseEnter += new MouseEventHandler(feSourceObject_MouseEnter); 
      feSourceObject.MouseLeave += new MouseEventHandler(feSourceObject_MouseLeave); 
     } 

     protected override void OnDetaching() 
     { 
      base.OnDetaching(); 
     } 
     void feSourceObject_MouseLeave(object sender, MouseEventArgs e) 
     { 
      DeactivateAnimation(); 
     } 
     void feSourceObject_MouseEnter(object sender, MouseEventArgs e) 
     { 
      ActivateAnimation(); 
     } 
     bool bAnimationActivated = false; 
     private void ActivateAnimation() 
     { 
      if (bAnimationActivated == false) 
      { 
       AnimateHoverZ(HoverOffset, true); 
       bAnimationActivated = true; 
      } 
     } 
     private void DeactivateAnimation() 
     { 
      if (bAnimationActivated == true) 
      { 
       AnimateHoverZ(0, false); 
       bAnimationActivated = false; 
      } 
     } 

     private void AnimateHoverZ(Double Z, bool HoverUp) 
     { 
      if (HoverUp == true) 
       playAnimation(feTargetObject, "(UIElement.Projection).(PlaneProjection.LocalOffsetZ)", HoverUp_duration, Z, SB_HoverZ, HoverUp_Easing); 
      else 
       playAnimation(feTargetObject, "(UIElement.Projection).(PlaneProjection.LocalOffsetZ)", HoverDown_Duration, Z, SB_HoverZ, HoverDown_Easing); 
     } 
     public static void playAnimation(FrameworkElement element, string property, TimeSpan time, double value, Storyboard sb, IEasingFunction EasingFunction) 
     { 
      sb = new Storyboard(); 
      sb.Children.Clear(); 
      DoubleAnimation animation = new DoubleAnimation(); 
      animation.Duration = time; 
      animation.To = value; 
      animation.EasingFunction = EasingFunction; 
      Storyboard.SetTargetProperty(animation, new PropertyPath(property)); 
      Storyboard.SetTarget(animation, element); 
      sb.Children.Add(animation); 
      sb.Begin(); 
     } 

    } 
} 
+0

幫助我們來幫助你。什麼不行?你是否將這種行爲添加到你的項目並編譯?你有什麼嘗試? – Tim 2011-05-23 14:29:20

+0

我從這個鏈接下載此行爲: http://gallery.expression.microsoft.com/MouseOver3D 請看看這個鏈接 – Mohsen 2011-05-23 14:38:30

+0

你添加的行爲,你的項目和編譯? – Tim 2011-05-23 14:51:29

回答

0

您需要添加必要引用(System.Windows.Interactivity) 到項目中,爲您需要安裝的Blend SDK的一些版本

然後使用這個XAML中,你需要定義命名空間的兩個交互而這種行爲。

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
xmlns:bs="clr-namespace:Brainsiders.MouseOver3D" 

那麼你應該能夠重視這樣的:

<Button> 
    <i:Interaction.Behaviors> 
     <bs:MouseOver3D /> 
    </i:Interaction.Behaviors> 
</Button> 
+0

當我使用XAML中的錯誤命名空間:命名空間前綴「i」的多重定義和錯誤的CS文件:類型或命名空間名稱「Planprojection」找不到(是否缺少...) – Mohsen 2011-05-23 16:54:14

+0

顯然,如果'i'是已經定義你應該使用另一個前綴。第二個錯誤肯定與此無關。 – 2011-05-23 16:57:33

+0

@Mohsen:現在您可能想出現在'Projections'只存在於Silverlight的。 – 2012-02-12 08:37:22