项目案例:WPF使用WindowsFormsHost播放视频,视频上显示边框、字幕等特效;

难点问题

1、WindowsFormsHost不支持背景透明;

2、WPF Panel.ZIndex无效,WindowsFormsHost更优先;

3、使用Show打开两个窗口,数据同步延时

解决方案:

使用Popup,解决最顶层、解决背景透明

使用Canvas,解决元素拖拽

XAML

  1. <ctrl:uiPopup x:Name="canvas" VerticalOffset="-410" IsOpen="True" AllowsTransparency="True" PopupAnimation="Fade">
  2. <Canvas Height="410" Width="548">
  3. <Image x:Name="PanelLeft" Height="410" Width="45" Canvas.Left="0"></Image>
  4. <Image x:Name="PanelTop" Height="45" Width="548" Canvas.Top="0"></Image>
  5. <Image x:Name="PanelRight" Height="410" Width="45" Canvas.Right="0"></Image>
  6. <Image x:Name="PanelBottom" Height="45" Width="548" Canvas.Bottom="0"></Image>
  7. <Image x:Name="PanelPlus" Height="100" Width="100" Panel.ZIndex="1"></Image>
  8. </Canvas>
  9. </ctrl:uiPopup>

ctrl:uiPopup控件,参考: 自定义WPF Popup控件  

C#

  1. //注册移动事件
  2. PanelPlus.MouseLeftButtonDown += rectOne_MouseLeftButtonDown;
  3. PanelPlus.MouseLeftButtonUp += rectOne_MouseLeftButtonUp;
  4. PanelPlus.MouseMove += rectOne_MouseMove;
  1. bool enableMove = false;
  2. double spanLeft = 0;
  3. double spanTop = 0;
  4. //鼠标移动
  5. private void rectOne_MouseMove(object sender, MouseEventArgs e)
  6. {
  7. if (enableMove)
  8. {
  9. var cLeft = e.GetPosition(canvas).X - spanLeft;
  10. var cTop = e.GetPosition(canvas).Y - spanTop;
  11. //设置矩形的位置
  12. Canvas.SetLeft(PanelPlus, cLeft);
  13. Canvas.SetTop(PanelPlus, cTop);
  14. }
  15. }
  16. //鼠标松开
  17. private void rectOne_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
  18. {
  19. //释放鼠标捕获
  20. PanelPlus.ReleaseMouseCapture();
  21. enableMove = false;
  22. }
  23. //鼠标按下
  24. private void rectOne_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  25. {
  26. var y = Convert.ToDouble(e.GetPosition(canvas).Y);
  27. y = Utils.IsNumber(y) ? y : 0;
  28. var x = Convert.ToDouble(e.GetPosition(canvas).X);
  29. x = Utils.IsNumber(x) ? x : 0;
  30.  
  31. //创建鼠标捕获
  32. Mouse.Capture(PanelPlus);
  33. double l = Convert.ToDouble(Canvas.GetLeft(PanelPlus));
  34. l = Utils.IsNumber(l) ? l : 0;
  35. double t = Convert.ToDouble(Canvas.GetTop(PanelPlus));
  36. t = Utils.IsNumber(t) ? t : 0;
  37. spanLeft = x - l;
  38. spanTop = y - t;
  39. enableMove = true;
  40. }
  1. public class Utils
  2. {
  3. //判断字符串是否为纯数字
  4. public static bool IsNumber(object str)
  5. {
  6. if (str == null) return false;
  7. ASCIIEncoding ascii = new ASCIIEncoding();
  8. byte[] bytestr = ascii.GetBytes(str.ToString());
  9.  
  10. foreach (byte c in bytestr)
  11. {
  12. if (c < 48 || c > 57)
  13. {
  14. return false;
  15. }
  16. }
  17. return true;
  18. }
  19. }

  

 

  

  

WPF解决WindowsFormsHost背景透明的更多相关文章

  1. WPF ChromiumWebBrowser 网页背景透明

    网页中添加下面样式即可: <style> html, body { margin: 0px; height: %; width: %; overflow: hidden; backgrou ...

  2. VC++ CStatic控件背景透明且改变其文本时,文字重叠解决方法

    最近在项目中将CStatic控件设置为背景透明且在一个定时器函数改变其文本,结果CStatic的文字重叠了.解决该问题的方案是:从CStatic类派生自己的静态文本控件. 其实设置背景透明,也就是在C ...

  3. ie6背景透明的设置方法 ie6背景颜色透明和png图像透明解决方法

    IE6浏览器,让我们又爱又恨.爱它的是,可以让我们写的代码的时候,可以更标准,恨的是,它有太多无厘头的IE6常见bug(详情点击),让我们焦头烂额.现在现在用百度浏览器调查,国内占有率不到6%了,但是 ...

  4. popupWindow设置后完美解决返回键响应无效的方案以及popupWindow背景透明方案

    // 点击其他地方消失 viewPuwAddNew.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouc ...

  5. 解决css设置背景透明,文字不透明

    设置元素的透明度:  -moz-opacity:0.8; /*在Firefox中设置元素透明度  filter: alpha(opacity=80); /*ie使用滤镜设置透明   但是当我们对一个标 ...

  6. WPF解决按钮上被透明控件遮盖时无法点击问题

    原文:WPF解决按钮上被透明控件遮盖时无法点击问题 IsHitTestVisible="False" 在控件上设置如上属性即可,即可让透明控件不触发点击效果

  7. C# 实现PNG文件的背景透明显示,解决动态显示闪烁问题 【转】

    http://blog.sina.com.cn/s/blog_402c071e0102x4rl.html    以下内容,对于想要使用C#实现PNG图片背景透明显示,同时动态显示时无闪烁问题的人来说, ...

  8. WPF Windows背景透明其中的文字保持不透明

    原文:WPF Windows背景透明其中的文字保持不透明 版权声明:本文为博主原创,未经允许不得转载.交流.源码资料加群:161154103 https://blog.csdn.net/mpegfou ...

  9. WPF实现背景透明磨砂,并通过HandyControl组件实现弹出等待框

    前言:上一个版本的Winform需要改成WPF来做界面,第一次接触WPF,在转换过程中遇到的需求就是一个背景透明模糊,一个是类似于 加载中…… 这样的等待窗口,等后台执行完毕后再关掉.在Winform ...

随机推荐

  1. Linux Tomcat安装及端口配置

    1.  JDK安装配置 待写 2. Tomcat安装配置 1,下载Tomcat链接,到启动测试. 将文件apache-tomcat-8.5.50.tar.gz移动到/usr/tomcat/下,并解压 ...

  2. 浅析Volatile关键字

    浅析Volatile关键字 在java中线程并发中,线程之间通信方式分为两种:共享内存和消息传递.共享内存指的是多个线程之间共享内存的属性状态:消息传递指的是线程之间发送信息来通信.在介绍volati ...

  3. Python 和 R 中的一数多图

    R # 一数多图 x <- 2:6 y <- 7:3 y1 <- y +2 opar <- par(no.readonly = TRUE) par(mfrow=c(2, 3)) ...

  4. wordpress迁移后登陆时出现Forbidden You don’t have permission to access /wp-login.php on this server

    之前在vps上,最近迁移到了php虚拟主机上,迁移后发现无法登陆后台出现403:Forbidden You don’t have permission to access /wp-login.php ...

  5. 第11节-BLE协议HCI层的硬件接口

    本篇博客由韦东山视频整理所得 如何控制链路层让其发出广播包.数据包?通过HCI层向它发出命令,也可以通过ATT层.L2CAP层向LL层发出数据. 学习资料: 蓝牙协议core_v5.0.pdf < ...

  6. LIST OF BEST OPEN SOURCE BLOCKCHAIN PLATFORMS

    https://www.blockchain-council.org/blockchain/list-of-best-open-source-blockchain-platforms/ Open so ...

  7. Sublime Text2中的快捷方式及html各种标签(待完善)

    快捷方式 1.xhtml+tab 2.自动补全标签 Alt + .  补全标签 标签 1.<p>段落标签 ,前后换行 <h1.2.3.4.5>标题标签 h1最大,一级标题 2. ...

  8. 提高 Visualforce 页面加载效率的小知识

    一般原则 在设计页面时,我们要将页面的功能降至最少,不要包含多余的功能和数据,以最大化提高运行效率 如果需要开发的功能可以通过 Salesforce 的标准功能实现,那么尽量使用标准功能,比如 工作流 ...

  9. selenium--加载浏览器配置

    前戏 在我们之前写的自动化脚本中,不知道大家有没有发现,每次打开的都是一个新的浏览器(相当于新安装的).但是有时候,我们想打开的是我们配置好的浏览器.我在之前的公司做web自动化的时候,由于我们的网站 ...

  10. 【CSP-S膜你考】那23个路口

    那23个路口 题面 故事的起源不加赘述,那23个路口. 单刀直入,我直接说题的意思. 蚊子和疯子在做一件事,就是他们要在茫茫的大街上找一个出发点,然后从出发点开始,经过上下左右23次拐弯,到达一个他们 ...