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()),Value = 1.0});
scaleXDoubleAnimation.KeyFrames.Add(new EasingDoubleKeyFrame{KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds()),Value = 0.95});
scaleXDoubleAnimation.KeyFrames.Add(new EasingDoubleKeyFrame{KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds()),Value = 1.0}); scaleYDoubleAnimation.KeyFrames.Add(new EasingDoubleKeyFrame{KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds()),Value = 1.0});
scaleYDoubleAnimation.KeyFrames.Add(new EasingDoubleKeyFrame{KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds()),Value = 0.95});
scaleYDoubleAnimation.KeyFrames.Add(new EasingDoubleKeyFrame{KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds()),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()),Value = });
animation.KeyFrames.Add(new EasingDoubleKeyFrame{KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds()),Value = });
animation.KeyFrames.Add(new EasingDoubleKeyFrame{KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds()),Value = });
Storyboard.SetTarget(animation, window);
Storyboard.SetTargetProperty(animation, new PropertyPath("(FrameworkElement.Effect).(DropShadowEffect.BlurRadius)"));
_storyboard = new Storyboard
{
Children = new TimelineCollection { animation }
};
设置后,点击窗口外部,子窗口唤醒时,会有窗口外部阴影变化
关键字:模态窗口,窗口抖动,窗口阴影
WPF window 子窗口反馈效果(抖动/阴影渐变)的更多相关文章
- WPF Window异形窗口演示
我们先通过简单的效果展示,切换展示不同图片: 我们先定义图片资源文件,我们可以在window资源中定义,下面的在app.xaml文件来定义: <Application x:Class=" ...
- .net4.6版本前设置window子窗口位置主窗口闪烁
在安装了.net4.6的版本是不会出现该问题的,但是在4.6以下的版本会出现,当设置之窗体的left和top属性时,会让主窗体闪烁一下. 之前是在load事件下写的: child_window.loa ...
- WPF制作子窗体的弹出动画效果
创建一个WPF应用程序WpfApplication1,新建个窗体DialogWin <Windowx:Class="WpfApplication1.DialogWin" xm ...
- 解决 WPF 嵌套的子窗口在改变窗口大小的时候闪烁的问题
原文:解决 WPF 嵌套的子窗口在改变窗口大小的时候闪烁的问题 因为 Win32 的窗口句柄是可以跨进程传递的,所以可以用来实现跨进程 UI.不过,本文不会谈论跨进程 UI 的具体实现,只会提及其实现 ...
- 父窗口window.showModalDialog传值 子窗口window.returnValue返回值
父窗口打开子窗口页面: var fatherWindow = document.all.dealReason;//想传的值 win = window.showModalDialog(strUrl, f ...
- JavaScript(Iframe、window.open、window.showModalDialog)父窗口与子窗口之间的操作
一.Iframe 篇 公共部分 //父对象得到子窗口的值 //ObjectID是窗口标识,ContentID是元素ID function GetValue(ObjectID,ContentID) { ...
- js window.open() 父窗口与子窗口的互相调用(未必有用)
javascript 父窗口与子窗口的互相调用 <html> <head></head> <body> 主要实现父子关系的页面 window.opene ...
- 总结JavaScript(Iframe、window.open、window.showModalDialog)父窗口与子窗口之间的操作
一.Iframe 篇 //&&&&&&&&&&&&&&&&&&a ...
- WPF FileFolderDialog 和弹出子窗口的一些问题
摘要:本文主要是WPF中 FileFolderDialog的相关问题,补充了关于在父窗口弹出子窗口,以及子窗口的相关属性(Data Binding)和命令绑定(Delegate Command)问题, ...
随机推荐
- C语言 字符二维数组(多个字符串)探讨 求解
什么是二维字符数组? 二维字符数组中为什么定义字符串是一行一个? “hello world”在C语言中代表什么? 为什么只能在定义时才能写成char a[10]="jvssj" ...
- Avro序列化与反序列化
4.Avro实现序列化的步骤 1.创建maven工程,引入pom文件(定义属性和依赖信息,以及定义Avro插件) 2.根据Avro插件的要求,更改maven工程结构,需要创建一个source/main ...
- 05 详解C# 迭代器
迭代器模式是设计模式中行为模式(behavioral pattern)的一个例子,他是一种简化对象间通讯的模式,也是一种非常容易理解和使用的模式. 简单来说,迭代器模式使得你能够获取到序列中的所有元素 ...
- Spring Boot使用过滤器和拦截器分别实现REST接口简易安全认证
本文通过一个简易安全认证示例的开发实践,理解过滤器和拦截器的工作原理. 很多文章都将过滤器(Filter).拦截器(Interceptor)和监听器(Listener)这三者和Spring关联起来讲解 ...
- (爬虫向)python_json学习笔记
JSON学习笔记 - 在线工具 - https://www.sojson.com/ - http://www.w3school.com.cn/json/ - http://www.runoob.com ...
- CentOS搭建FTP服务
前言: 环境:centos7.5 64 位 正文: 使用 yum 安装 vsftpd yum install vsftpd -y 安装完成后,启动 FTP 服务: service vsftpd sta ...
- Tomcat 的 server.xml 文件详解
文件内容解读 <?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apac ...
- 【PHP篇】输出方法
php开始处加:error_reporting(E_ALL & ~E_NOTICE); //不打印注意 echo: echo “字符串”; //也可为单引号 echo $变量名; ech ...
- mongo 让字段自增或自减
查询语句 db.getCollection("A表").update( { id: 1 }, { $inc: { pid: 1} } ) 作用:根据条件让A表中的pid字段自增1 ...
- okHttp超时报错解决方案
Android 使用okhttp,如果客户端等待的时间超过了okHttp的默认时间,就会报错java.net.SocketTimeoutException: timeout 所以,需要在调用okHtt ...