WPF window 子窗口反馈效果(抖动/阴影渐变)
2021-06-21 04:02
标签:ref value drop htm lin div html ntp this 当设置了owner的子窗口显示后,点击子窗口外部,需要一种反馈机制(反馈动画)。 实现: 每次点击子窗口外部,即母窗口时,事件捕捉如下 HwndSource hwndSource = PresentationSource.FromVisual(this.Owner) as HwndSource;//窗口过程 hwndSource?.AddHook(WndProc); 也可以调用WindowInteropHelper,获取母窗口句柄。 var hwnd = new WindowInteropHelper(this.Owner).Handle; 事件中,启动动画 设置后,点击窗口外部,子窗口唤醒时,会有窗口大小变化(抖动的效果) 设置后,点击窗口外部,子窗口唤醒时,会有窗口外部阴影变化 关键字:模态窗口,窗口抖动,窗口阴影 WPF window 子窗口反馈效果(抖动/阴影渐变) 标签:ref value drop htm lin div html ntp this 原文地址:https://www.cnblogs.com/lonelyxmas/p/10249486.html1.触发源
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 }
};