码迷,mamicode.com
首页 > Windows程序 > 详细

WPF window 子窗口反馈效果(抖动/阴影渐变)

时间:2019-01-10 14:00:19      阅读:288      评论:0      收藏:0      [点我收藏+]

标签:ref   value   drop   htm   lin   div   html   ntp   this   

原文:WPF window 子窗口反馈效果(抖动/阴影渐变)

 当设置了owner的子窗口显示后,点击子窗口外部,需要一种反馈机制(反馈动画)。

实现:

1.触发源

每次点击子窗口外部,即母窗口时,事件捕捉如下

HwndSource hwndSource = PresentationSource.FromVisual(this.Owner) as HwndSource;//窗口过程

hwndSource?.AddHook(WndProc);

 也可以调用WindowInteropHelper,获取母窗口句柄。

var hwnd = new WindowInteropHelper(this.Owner).Handle;
if (hwnd != IntPtr.Zero)
{
  var hwndSource = HwndSource.FromHwnd(hwnd);
  hwndSource?.AddHook(WndProc);
}

事件中,启动动画

 private static IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
    {
         if (msg != 0x20) return IntPtr.Zero;
         if (lParam.ToInt32() == 0x201fffe) _storyboard?.Begin();
         return IntPtr.Zero;
    }

 

2.动画设置

窗口抖动 动画

            var scaleXDoubleAnimation = new DoubleAnimationUsingKeyFrames();
            var scaleYDoubleAnimation = new DoubleAnimationUsingKeyFrames();

            scaleXDoubleAnimation.KeyFrames.Add(new EasingDoubleKeyFrame{KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(0)),Value = 1.0});
            scaleXDoubleAnimation.KeyFrames.Add(new EasingDoubleKeyFrame{KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(100)),Value = 0.95});
            scaleXDoubleAnimation.KeyFrames.Add(new EasingDoubleKeyFrame{KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(200)),Value = 1.0});

            scaleYDoubleAnimation.KeyFrames.Add(new EasingDoubleKeyFrame{KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(0)),Value = 1.0});
            scaleYDoubleAnimation.KeyFrames.Add(new EasingDoubleKeyFrame{KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(100)),Value = 0.95});
            scaleYDoubleAnimation.KeyFrames.Add(new EasingDoubleKeyFrame{KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(200)),Value = 1.0});

            Storyboard.SetTarget(scaleXDoubleAnimation, window);
            Storyboard.SetTarget(scaleYDoubleAnimation, window);
            Storyboard.SetTargetProperty(scaleXDoubleAnimation, new PropertyPath("(UIElement.RenderTransform).(ScaleTransform.ScaleX)"));
            Storyboard.SetTargetProperty(scaleYDoubleAnimation, new PropertyPath("(UIElement.RenderTransform).(ScaleTransform.ScaleY)"));

            _storyboard = new Storyboard{Children =new TimelineCollection { scaleXDoubleAnimation, scaleYDoubleAnimation }};

 设置后,点击窗口外部,子窗口唤醒时,会有窗口大小变化(抖动的效果)

 

窗口阴影 动画

            var animation = new DoubleAnimationUsingKeyFrames();

            animation.KeyFrames.Add(new EasingDoubleKeyFrame{KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(0)),Value = 0});
            animation.KeyFrames.Add(new EasingDoubleKeyFrame{KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(200)),Value = 50});
            animation.KeyFrames.Add(new EasingDoubleKeyFrame{KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(400)),Value = 0});
            
            Storyboard.SetTarget(animation, window);
            Storyboard.SetTargetProperty(animation, new PropertyPath("(FrameworkElement.Effect).(DropShadowEffect.BlurRadius)"));

            _storyboard = new Storyboard
            {
                Children = new TimelineCollection { animation }
            };

 设置后,点击窗口外部,子窗口唤醒时,会有窗口外部阴影变化

 

关键字:模态窗口,窗口抖动,窗口阴影

WPF window 子窗口反馈效果(抖动/阴影渐变)

标签:ref   value   drop   htm   lin   div   html   ntp   this   

原文地址:https://www.cnblogs.com/lonelyxmas/p/10249486.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!