• 【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 = 50 * randomspeed;
                    //实例化TextBlock和设置基本属性,并添加到Canvas中
                    TextBlock textblock = new TextBlock();
                    textblock.Text = item;
                    textblock.FontSize = 50;
                    Canvas.SetTop(textblock, inittop);
                    canvas.Children.Add(textblock);
                    //实例化动画
                    DoubleAnimation animation = new DoubleAnimation();   
                    Timeline.SetDesiredFrameRate(animation,60);  //如果有性能问题,这里可以设置帧数
                    animation.From = 0;
                    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特性使实现起来的界面效果可以千变万化.

  • 相关阅读:
    2018/12/05 PAT刷题 L1-014 简单题 Java
    2018/12/05 PAT刷题 L1-013 计算阶乘和 Java
    2018/12/04 PAT刷题 L1-012 计算指数 java
    L1-011 A-B Java 部分解
    2018/12/04 PAT再思考 L1-010 比较大小
    2018/12/04 PAT刷题 L1-009 N个数求和 java
    2018/12/04 PAT刷题 L1-008 求整数段和 java
    2018/12/04 PAT刷题 L1-007 念数字 java
    建造者模式
    外观模式
  • 原文地址:https://www.cnblogs.com/caizl/p/4606000.html
Copyright © 2020-2023  润新知