【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实现屏幕最前端的绘图?的更多相关文章
- [WPF]VS2019打包WPF程序
原文:[WPF]VS2019打包WPF程序 版权声明:本文为本人原创文章,未经博主允许不得转载. https://blog.csdn.net/m0_37316917/article/details/8 ...
- WPF 精修篇 WPF 使用ActiveX
原文:WPF 精修篇 WPF 使用ActiveX WPF 实现远程桌面功能 首先使用 开发人员命令提示 进入 自己的项目文件根目录下 输入 aximp C:\windows\System32\msts ...
- WPF 精修篇 WPF嵌入Winfrom控件
原文:WPF 精修篇 WPF嵌入Winfrom控件 先增加DLL 支持 使用 WindowsFormsHost 来加载Forms的控件 引用命名空间 xmlns:forms="clr-na ...
- WPF 获得鼠标相对于屏幕的位置,相对于控件的位置
相对于屏幕的位置 第一步: /// <summary> /// 用于获得鼠标相对于屏幕的位置 /// </summary> public class Win3 ...
- [WPF] 我的WPF自学日记2,自定义入口
在winform中入口文件就是Program.cs,而在WPF中看不到,因为它是自动生成的,可以说隐藏了,我们可以自定义一个入口文件,然后修改项目属性中的启动对象为我们自定义的入口文件. 首先新建入口 ...
- [WPF] 我的WPF自学日记1,无标题窗体拖动
学习WPF的第一天,尝试写比较常用的功能,无标题窗体拖动. 先在设计界面给它加上MouseDown事件 <Window x:Class="MyFirstWPFAPP.MainWindo ...
- 当前位置: 银光首页 > WPF > WPF学习教程 > WPF: ShowDialog() 切换到其他应用窗口后,再切换回来无法让子窗口总在最上方
转自http://www.silverlightchina.net/html/study/WPF/2012/0723/17608.html
- wpf 导出Excel Wpf Button 样式 wpf简单进度条 List泛型集合对象排序 C#集合
wpf 导出Excel 1 private void Button_Click_1(object sender, RoutedEventArgs e) 2 { 3 4 ExportDataGrid ...
- 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 ...
随机推荐
- 带你从零学ReactNative开发跨平台App开发(二)
ReactNative跨平台开发系列教程: 带你从零学ReactNative开发跨平台App开发(一) 带你从零学ReactNative开发跨平台App开发(二) 带你从零学ReactNative开发 ...
- git版本超前了N个版本且落后了N个版本的解决办法
当遇到该问题的时候,一般情况下我们会首先拉取,紧接着就出现了一系列问题………… 其实当输入命令,git pull的时候,会报错,这时瞬间就感到凌乱了&……*%%*%………… 莫慌…… 这时输入 ...
- pyhon类继承
1,python类的继承 class A(object): name ='eason' age = '22' def __init__(self): print '我是A的构造函数!!!' def g ...
- Javascript基础笔记(部分)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- MySQL安全策略
0.导读 MySQL被运用于越来越多的业务中,在关键业务中对数据安全性的要求也更高,如何保证MySQL的数据安全? MySQL被运用于越来越多的业务中,在关键业务中对数据安全性的要求也更高,如何保证M ...
- Python socket应用
Server端: #-*- coding: UTF-8 -*- import socket,time host='192.168.0.9' port=12307 s=socket.socket(soc ...
- Mysql学习---面试基础知识点总结
drop.truncate. delete区别 TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行.但 TRUNCATE TABLE 比 ...
- DLL导出类避免地狱问题的完美解决方案
DLL动态链接库是程序复用的重要方式,DLL可以导出函数,使函数被多个程序复用,DLL中的函数实现可以被修改而无需重新编译和连接使用该DLL的应用程序.作为一名面向对象的程序员,希望DLL可以导出类, ...
- selenium-各种定位方法
selenium各种定位方法. https://www.red-gate.com/simple-talk/wp-content/uploads/imported/1269-Locators_table ...
- centos7装机教程
U盘启动电脑进入安装界面 正常情况下你应该会看到下面的这个界面: 选择第一项,然后按TAB键,然后会看到下面这个: 3.修改第二步中按TAB键出来的命令 将命令修改为:>vmlinuz init ...