標籤:animation 漸層 Owner and ref var mil 視窗 present
當子視窗顯示後,點擊子視窗外部,需要有反饋動畫。
實現:
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.9}); 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.9}); 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 子視窗反饋效果(拉動/漸層)