原文:【WPF】如何使用wpf实现屏幕最前端的绘图?

引言

在知乎上面看到如何使用wpf实现屏幕最前端的绘图? 这么一个问题,觉得全屏弹幕很有趣,所以把它实现了.

实现

界面设置很简单,Window界面无边框+最大化+允许不规则+背景色透明+置顶,如下

<Window x:Class="FullScreen.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" WindowState="Maximized" Topmost="True" AllowsTransparency="True" Background="Transparent" WindowStyle="None" >
<Canvas Name="canvas"> </Canvas>
</Window>

弹幕信息出现的位置和速度都随机产生,还要保证永远最大化和置顶,如下

 public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.Loaded += MainWindow_Loaded;
this.Deactivated += MainWindow_Deactivated;
this.StateChanged += MainWindow_StateChanged;
}
/// <summary>
/// 确保永远最大化
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void MainWindow_StateChanged(object sender, EventArgs e)
{
this.WindowState = WindowState.Maximized;
}
/// <summary>
/// 确保永远置顶
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void MainWindow_Deactivated(object sender, EventArgs e)
{
this.Topmost = true;
}
void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
List<string> list = new List<string>();
list.Add("你们的");
list.Add("生活");
list.Add("真丰富");
list.Add("不像我");
list.Add("一个");
list.Add("帅");
list.Add("字");
list.Add("竟贯穿了");
list.Add("一生");
Barrage(list);
} /// <summary>
/// 在Window界面上显示弹幕信息,速度和位置随机产生
/// </summary>
/// <param name="contentlist"></param>
public void Barrage(IEnumerable<string> contentlist)
{
Random random = new Random();
foreach (var item in contentlist)
{ //获取位置随机数
double randomtop = random.NextDouble();
double inittop = canvas.ActualHeight * randomtop;
//获取速度随机数
double randomspeed = random.NextDouble();
double initspeed = * randomspeed;
//实例化TextBlock和设置基本属性,并添加到Canvas中
TextBlock textblock = new TextBlock();
textblock.Text = item;
textblock.FontSize = ;
Canvas.SetTop(textblock, inittop);
canvas.Children.Add(textblock);
//实例化动画
DoubleAnimation animation = new DoubleAnimation();
Timeline.SetDesiredFrameRate(animation,); //如果有性能问题,这里可以设置帧数
animation.From = ;
animation.To = canvas.ActualWidth;
animation.Duration = TimeSpan.FromSeconds(initspeed);
animation.AutoReverse = true;
animation.RepeatBehavior = RepeatBehavior.Forever;
animation.Completed += (object sender, EventArgs e) =>
{
canvas.Children.Remove(textblock);
};
//启动动画
textblock.BeginAnimation(Canvas.LeftProperty, animation);
} } }

效果图

小结

本文主要利用了WPF的动画和窗体的不规则化属性,这些WPF特性使实现起来的界面效果可以千变万化.

【WPF】如何使用wpf实现屏幕最前端的绘图?的更多相关文章

  1. [WPF]VS2019打包WPF程序

    原文:[WPF]VS2019打包WPF程序 版权声明:本文为本人原创文章,未经博主允许不得转载. https://blog.csdn.net/m0_37316917/article/details/8 ...

  2. WPF 精修篇 WPF 使用ActiveX

    原文:WPF 精修篇 WPF 使用ActiveX WPF 实现远程桌面功能 首先使用 开发人员命令提示 进入 自己的项目文件根目录下 输入 aximp C:\windows\System32\msts ...

  3. WPF 精修篇 WPF嵌入Winfrom控件

    原文:WPF 精修篇 WPF嵌入Winfrom控件 先增加DLL 支持 使用  WindowsFormsHost 来加载Forms的控件 引用命名空间 xmlns:forms="clr-na ...

  4. WPF 获得鼠标相对于屏幕的位置,相对于控件的位置

    相对于屏幕的位置 第一步: /// <summary>    /// 用于获得鼠标相对于屏幕的位置    /// </summary>    public class Win3 ...

  5. [WPF] 我的WPF自学日记2,自定义入口

    在winform中入口文件就是Program.cs,而在WPF中看不到,因为它是自动生成的,可以说隐藏了,我们可以自定义一个入口文件,然后修改项目属性中的启动对象为我们自定义的入口文件. 首先新建入口 ...

  6. [WPF] 我的WPF自学日记1,无标题窗体拖动

    学习WPF的第一天,尝试写比较常用的功能,无标题窗体拖动. 先在设计界面给它加上MouseDown事件 <Window x:Class="MyFirstWPFAPP.MainWindo ...

  7. 当前位置: 银光首页 > WPF > WPF学习教程 > WPF: ShowDialog() 切换到其他应用窗口后,再切换回来无法让子窗口总在最上方

    转自http://www.silverlightchina.net/html/study/WPF/2012/0723/17608.html

  8. wpf 导出Excel Wpf Button 样式 wpf简单进度条 List泛型集合对象排序 C#集合

    wpf 导出Excel   1 private void Button_Click_1(object sender, RoutedEventArgs e) 2 { 3 4 ExportDataGrid ...

  9. How do I duplicate a resource reference in code behind in WPF?如何在WPF后台代码中中复制引用的资源?

    原文 https://stackoverflow.com/questions/28240528/how-do-i-duplicate-a-resource-reference-in-code-behi ...

随机推荐

  1. js实现浏览器用户信息收集

    前言 这是一个通过html5,javascript用于收集用户通过上网泄漏的各种信息,包括地理位置,IP地址,照片,语音,浏览器版本等信息.结合大数据,可实现广告定向投放,用户追踪,用户行为分析,用户 ...

  2. sql server对并发的处理-乐观锁和悲观锁(转)

    假如两个线程同时修改数据库同一条记录,就会导致后一条记录覆盖前一条,从而引发一些问题. 例如: 一个售票系统有一个余票数,客户端每调用一次出票方法,余票数就减一. 情景: 总共300张票,假设两个售票 ...

  3. 如何在 Azure 中自定义 Windows 虚拟机

    若要以快速一致的方式配置虚拟机 (VM),通常需要某种形式的自动化. 自定义 Windows VM 的一种常用方法是使用适用于 Windows 的自定义脚本扩展. 本教程介绍如何执行下列操作: 使用自 ...

  4. Linux load average负载量分析与解决思路

    一.load average top命令中load average显示的是最近1分钟.5分钟和15分钟的系统平均负载.系统平均负载表示 系统平均负载被定义为在特定时间间隔内运行队列中(在CPU上运行或 ...

  5. iptables实战演练

    iptables禁止 ip 10.10.10.1 访问本地80端口: iptables -t filter -I INPUT -s 10.10.10.1 -p tcp –dport 80 -j DRO ...

  6. Docker容器学习与分享10

    Docker容器向外提供服务 用分享04中的Nginx服务来试一下. 不过这次我直接用Nginx镜像创建容器,先下载Nginx镜像. [root@promote ~]# docker search n ...

  7. lavarel模板引擎blade学习

    blade 模板学习 特点 主要的两个优点是:模板继承和区块 继承页面布局 布局文件(layout.php) + 详情文件 (page.php) 的组合,即一般到具体的组合.在blade文件之中的体现 ...

  8. jQ判断一个元素是否为空

    // 方法一 if (!$('#jb51').html()) { //http://www.jb51.net 什么都没有找到; } // 方法二 if ($('#jb51').is(":em ...

  9. 基于汇编的 C/C++ 协程 - 背景知识

    近几年来,协程在 C/C++ 服务器中的解决方案开始涌现.本文主要阐述以汇编实现上下文切换的协程方案,并且说明其在异步开发模式中的应用. 本文地址:https://segmentfault.com/a ...

  10. VS2013自带报表+打印功能

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u010773667/article/details/27540389 经过了VB版机房收费系统的学习 ...