如何在表达式混合中添加行为

问题描述

| 你好 以下代码有行为 我想在我的WPF应用程序中使用此行为 但是我不能将此行为附加到我的项目中
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,HoverDown_Duration,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();
        }

    }
}
    

解决方法

您需要在项目中添加必要的引用(
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>
    

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...