走进WPF之开发类似Visio软件

这篇具有很好参考价值的文章主要介绍了走进WPF之开发类似Visio软件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

当你想画一个流程图的时候,你会发现,很多软件要么需要秘钥,要么需要会员,这时我就在想,可不可自己制作一款流程图软件呢?本文以一个简单的小例子,简述如何利用WPF制作属于自己的流程图软件,仅供学习分享使用,如有不足之处,还请指正。

涉及知识点

本示例主要通过WPF技术进行开发,涉及知识点如下:

  1. WPF绘图,如矩形,直线等功能的相关图形技术。
  2. Thumb控件,本控件可以由用户自由拖动,示例中所用到的可移动的图形控件,都继承于Thumb控件。

Thumb控件简介

Thumb控件是WPF提供的用于用户拖动的控件。默认情况下,Thumb控件并不在工具箱中,需要手动添加,如下所示:

工具箱-->常规-->右键-->选择项,然后打开【选择工具箱对话框】,如下所示:

走进WPF之开发类似Visio软件

在选【择工具箱项】页面,打开WPF组件-->选择Thumb-->点击确定按钮,如下所示:

走进WPF之开发类似Visio软件

 添加成功后,即可从工具箱拖动到页面,如下所示:

走进WPF之开发类似Visio软件

关于Thumb控件的简介,如下所示:

namespace System.Windows.Controls.Primitives
{
    //
    // 摘要:
    //     表示可以由用户拖动的控件。
    [DefaultEvent("DragDelta")]
    [Localizability(LocalizationCategory.NeverLocalize)]
    public class Thumb : Control
    {
        //
        // 摘要:
        //     标识 System.Windows.Controls.Primitives.Thumb.DragStarted 路由事件。
        //
        // 返回结果:
        //     System.Windows.Controls.Primitives.Thumb.DragStarted 路由事件的标识符。
        public static readonly RoutedEvent DragStartedEvent;
        //
        // 摘要:
        //     标识 System.Windows.Controls.Primitives.Thumb.DragDelta 路由事件。
        //
        // 返回结果:
        //     System.Windows.Controls.Primitives.Thumb.DragDelta 路由事件的标识符。
        public static readonly RoutedEvent DragDeltaEvent;
        //
        // 摘要:
        //     标识 System.Windows.Controls.Primitives.Thumb.DragCompleted 路由事件。
        //
        // 返回结果:
        //     System.Windows.Controls.Primitives.Thumb.DragCompleted 路由事件的标识符。
        public static readonly RoutedEvent DragCompletedEvent;
        //
        // 摘要:
        //     标识 System.Windows.Controls.Primitives.Thumb.IsDragging 依赖属性。
        //
        // 返回结果:
        //     System.Windows.Controls.Primitives.Thumb.IsDragging 依赖项属性的标识符。
        public static readonly DependencyProperty IsDraggingProperty;

        //
        // 摘要:
        //     初始化 System.Windows.Controls.Primitives.Thumb 类的新实例。
        public Thumb();

        //
        // 摘要:
        //     获取是否 System.Windows.Controls.Primitives.Thumb 控件具有逻辑焦点和捕获鼠标并按下鼠标左键。
        //
        // 返回结果:
        //     true 如果 System.Windows.Controls.Primitives.Thumb 控件具有焦点且鼠标捕获; 否则为 false。 默认值为
        //     false。
        [Bindable(true)]
        [Browsable(false)]
        [Category("Appearance")]
        public bool IsDragging { get; protected set; }

        //
        // 摘要:
        //     发生时 System.Windows.Controls.Primitives.Thumb 控件接收逻辑焦点和鼠标捕获。
        [Category("Behavior")]
        public event DragStartedEventHandler DragStarted;
        //
        // 摘要:
        //     根据鼠标位置更改时出现了一个或多个次 System.Windows.Controls.Primitives.Thumb 控件具有逻辑焦点和鼠标捕获。
        [Category("Behavior")]
        public event DragDeltaEventHandler DragDelta;
        //
        // 摘要:
        //     发生时 System.Windows.Controls.Primitives.Thumb 控件失去鼠标捕获。
        [Category("Behavior")]
        public event DragCompletedEventHandler DragCompleted;

        //
        // 摘要:
        //     取消的拖动操作 System.Windows.Controls.Primitives.Thumb。
        public void CancelDrag();
        //
        // 摘要:
        //     创建 System.Windows.Automation.Peers.AutomationPeer 为 System.Windows.Controls.Primitives.Thumb
        //     控件。
        //
        // 返回结果:
        //     一个 System.Windows.Automation.Peers.ThumbAutomationPeer 为 System.Windows.Controls.Primitives.Thumb
        //     控件。
        protected override AutomationPeer OnCreateAutomationPeer();
        //
        // 摘要:
        //     响应 System.Windows.Controls.Primitives.Thumb.IsDragging 属性值的更改。
        //
        // 参数:
        //   e:
        //     事件数据。
        protected virtual void OnDraggingChanged(DependencyPropertyChangedEventArgs e);
        //
        // 摘要:
        //     提供类处理 System.Windows.ContentElement.MouseLeftButtonDown 事件。
        //
        // 参数:
        //   e:
        //     事件数据。
        protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e);
        //
        // 摘要:
        //     提供类处理 System.Windows.ContentElement.MouseLeftButtonUp 事件。
        //
        // 参数:
        //   e:
        //     事件数据。
        protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e);
        //
        // 摘要:
        //     提供类处理 System.Windows.UIElement.MouseMove 事件。
        //
        // 参数:
        //   e:
        //     事件数据。
        protected override void OnMouseMove(MouseEventArgs e);
    }
}

通过上述摘要简介,发现Thumb控件提供了三个事件,分别是:

  • 拖动开始事件:public event DragStartedEventHandler DragStarted;
  • 拖动进行事件:public event DragDeltaEventHandler DragDelta;
  • 拖动完成事件:public event DragCompletedEventHandler DragCompleted;

 Thumb控件示例

首先在窗口页面上添加一个Thumb控件,然后分别添加三个事件,如下所示:

<Window x:Class="DemoVisio.MainWindow1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:DemoVisio"
        mc:Ignorable="d"
        Title="Thumb示例" Height="450" Width="800">
    <Canvas>
        <Thumb x:Name="thumb" Canvas.Left="0" Canvas.Top="0"  Height="100"  Width="100"   DragStarted="thumb_DragStarted" DragDelta="thumb_DragDelta" DragCompleted="thumb_DragCompleted"/>

    </Canvas>
</Window>

然后在三个事件中添加代码,终点是DragDelta事件,如下所示:

namespace DemoVisio
{
    /// <summary>
    /// MainWindow1.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow1 : Window
    {
        public MainWindow1()
        {
            InitializeComponent();
        }

        private void thumb_DragStarted(object sender, DragStartedEventArgs e)
        {
            //开始拖动
        }

        /// <summary>
        /// 拖动
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void thumb_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
        {
            Thumb myThumb = (Thumb)sender;
            double nTop = Canvas.GetTop(myThumb) + e.VerticalChange;
            double nLeft = Canvas.GetLeft(myThumb) + e.HorizontalChange;
            Canvas.SetTop(myThumb, nTop);
            Canvas.SetLeft(myThumb, nLeft);
        }

        private void thumb_DragCompleted(object sender, DragCompletedEventArgs e)
        {
            //拖动完成
        }
    }
}

注意,在XAML中,Thumb一定是在Canvas布局容器中,且一定要设置【Canvas.Left="0" Canvas.Top="0"】两个属性,如果不设置,在值为NaN,无法进行拖动。

默认情况下,Thumb控件就是一个丑丑的方块,如下所示:

走进WPF之开发类似Visio软件

拖动控件基类

在本示例中,流程图需要多种控件(如:圆形,矩形,线等),不能每一个控件都去实现那三个事件【DragStarted,DragDelta,DragCompleted】,所以需要定义一个基类ThumbControl,统一实现方案。具体如下所示:

namespace DemoVisio
{
    public class ThumbControl : Thumb
    {
        /// <summary>
        /// 是否可以输入
        /// </summary>
        public bool IsEnableInput { get { return (bool)GetValue(IsEnableInputProperty); } set {SetValue( IsEnableInputProperty, value); } }

        /// <summary>
        /// 依赖属性
        /// </summary>
        public static readonly DependencyProperty IsEnableInputProperty = DependencyProperty.Register("IsEnableInput",typeof(bool),typeof(ThumbControl));

        public ThumbControl():base() {
            this.DragStarted += ThumbControl_DragStarted;
            this.DragDelta += ThumbControl_DragDelta;
            this.DragCompleted += ThumbControl_DragCompleted;
            this.MouseDoubleClick += ThumbControl_MouseDoubleClick;
            this.IsKeyboardFocusedChanged += ThumbControl_IsKeyboardFocusedChanged;
        }

        public void SetIsEnableInput(bool flag)
        {
            this.IsEnableInput = flag;
        }

        /// <summary>
        /// 是否具有键盘焦点
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ThumbControl_IsKeyboardFocusedChanged(object sender, DependencyPropertyChangedEventArgs e)
        {

            this.IsEnableInput = this.IsKeyboardFocused;

        }

        /// <summary>
        /// 双击事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ThumbControl_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            this.IsEnableInput = true;
        }

        private void ThumbControl_DragStarted(object sender, DragStartedEventArgs e)
        {
            //开始移动
        }

        private void ThumbControl_DragDelta(object sender, DragDeltaEventArgs e)
        {
            Thumb myThumb = (Thumb)sender;
            double nTop = Canvas.GetTop(myThumb) + e.VerticalChange;
            double nLeft = Canvas.GetLeft(myThumb) + e.HorizontalChange;
            Canvas.SetTop(myThumb, nTop);
            Canvas.SetLeft(myThumb, nLeft);
        }

        private void ThumbControl_DragCompleted(object sender, DragCompletedEventArgs e)
        {
            //移动结束
        }
    }
}

具体图形控件

封装了基类以后,其他控件可以在此基础上进行使用,通过ControlTemplate展现不同的形态,如下所示:

1. 矩形方块

在流程图中,矩形方块一般表示过程,实现代码如下所示:

<UserControl x:Class="DemoVisio.SquareControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:DemoVisio"
             mc:Ignorable="d"
             d:DesignHeight="450" d:DesignWidth="800">
    <Canvas>
        <local:ThumbControl x:Name="s" BorderThickness="1" Canvas.Top ="0" Canvas.Left="0" Width="100" Height="60" Background="AliceBlue">
            <Thumb.Template>
                <ControlTemplate>
                    <Border Width="{Binding ElementName=s, Path=Width}" Height="{Binding ElementName=s, Path=Height}" BorderBrush="Black" Background="{Binding ElementName=s, Path=Background}" BorderThickness="{Binding ElementName=s, Path=BorderThickness}" Padding="2">
                        <TextBox Background="{Binding ElementName=s, Path=Background}" BorderThickness="0" VerticalAlignment="Center"  IsEnabled="{Binding ElementName=s, Path=IsEnableInput}" MinLines="3" MaxLines="3" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"></TextBox>
                    </Border>

                </ControlTemplate>
            </Thumb.Template>
        </local:ThumbControl>
    </Canvas>
</UserControl>

2. 圆形图

在流程图中,圆形一般表示开始和结束,如下所示:

<UserControl x:Class="DemoVisio.CircleControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:DemoVisio"
             mc:Ignorable="d"
             d:DesignHeight="450" d:DesignWidth="800">
    <Canvas>
        <local:ThumbControl x:Name="s" Canvas.Top ="0" Canvas.Left="0" Width="60" Height="60" Background="AliceBlue" BorderThickness="1" >
            <local:ThumbControl.Template>
                <ControlTemplate>
                    <Grid>
                        <Border Width="{Binding Width}" Height="{Binding Height}" CornerRadius="30" BorderThickness="{Binding ElementName=s, Path=BorderThickness}" BorderBrush="Black" Background="{Binding ElementName=s, Path=Background}">
                            <TextBox VerticalAlignment="Center" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" MaxLines="2" MinLines="1" Width="{Binding Width}" Height="{Binding Height}" Background="{Binding ElementName=s, Path=Background}" BorderThickness="0" IsEnabled="{Binding ElementName=s, Path=IsEnableInput}"></TextBox>
                        </Border>
                    </Grid>
                </ControlTemplate>
            </local:ThumbControl.Template>

        </local:ThumbControl>
    </Canvas>
</UserControl>

3. 菱形图

在流程图中,菱形一般表示选择,表达程序中的布尔值。如下所示:

<UserControl x:Class="DemoVisio.RhombusControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:DemoVisio"
             mc:Ignorable="d"
             d:DesignHeight="450" d:DesignWidth="800">
    <Canvas>
        <local:ThumbControl x:Name="s" Canvas.Left="0" Canvas.Top="0"  Width="80" Height="80" Background="AliceBlue" BorderThickness="1"  >
            <Thumb.Template>
                <ControlTemplate>
                    <Border Width="{Binding ElementName=s, Path=Width}" Height="{Binding ElementName=s, Path=Height}" BorderBrush="Black" Background="{Binding ElementName=s, Path=Background}" BorderThickness="{Binding ElementName=s, Path=BorderThickness}" Padding="1">
                        <TextBox Background="{Binding ElementName=s, Path=Background}" BorderThickness="0" VerticalAlignment="Center"  IsEnabled="{Binding ElementName=s, Path=IsEnableInput}" Width="50" Height="50" HorizontalContentAlignment="Center" VerticalContentAlignment="Center">
                            <TextBox.RenderTransform>
                                <RotateTransform CenterX="25" CenterY="25" Angle="-45" ></RotateTransform>
                            </TextBox.RenderTransform>
                        </TextBox>
                    </Border>

                </ControlTemplate>

            </Thumb.Template>
            <Thumb.RenderTransform>

                <TransformGroup>
                    <RotateTransform CenterX="40" CenterY="40" Angle="45"></RotateTransform>
                    <ScaleTransform CenterX="40" CenterY="40" ScaleX="0.8"></ScaleTransform>
                    <TranslateTransform X="10" Y="15"></TranslateTransform>
                </TransformGroup>
            </Thumb.RenderTransform>
        </local:ThumbControl>
    </Canvas>
</UserControl>

4. 直线

在流程图中,直线一般表示两个过程之间的连接,如下所示:

<UserControl x:Class="DemoVisio.LineArrowControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:DemoVisio"
             mc:Ignorable="d"
             d:DesignHeight="450" d:DesignWidth="800">
    <Canvas>
        <local:ThumbControl x:Name="s" Canvas.Left="0" Canvas.Top="0"  Width="100" Height="100" Background="AliceBlue" IsEnableInput="False">
            <local:ThumbControl.Template>
                <ControlTemplate>
                    <Grid>

                        <Line X1="0" Y1="0" X2="0" Y2="100" Stroke="Black" StrokeThickness="2" HorizontalAlignment="Center" >

                        </Line>
                        <Line X1="-5" Y1="90" X2="1" Y2="100" StrokeThickness="2" Stroke="Black" HorizontalAlignment="Center"></Line>
                        <Line X1="8" Y1="90" X2="3" Y2="100" StrokeThickness="2" Stroke="Black" HorizontalAlignment="Center"></Line>
                        <TextBox VerticalAlignment="Center" Height="30" HorizontalContentAlignment="Center" BorderThickness="0" VerticalContentAlignment="Center" MinLines="1" MaxLines="2" IsEnabled="{Binding ElementName=s, Path=IsEnableInput}" Opacity="0" Visibility="{Binding ElementName=s, Path=IsEnableInput}"></TextBox>
                    </Grid>
                </ControlTemplate>
            </local:ThumbControl.Template>

        </local:ThumbControl>
    </Canvas>
</UserControl>

主窗体

主窗体主要用于绘制流程图,分为左右两部分,左边是控件列表,右边是布局容器,如下所示:

<Window x:Class="DemoVisio.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:DemoVisio"
        mc:Ignorable="d"
        Title="流程图" Height="800" Width="800" MouseDown="Window_MouseDown" Loaded="Window_Loaded">
    <Window.Resources>
        <Style TargetType="TextBlock">
            <Setter Property="HorizontalAlignment" Value="Center"></Setter>
        </Style>
    </Window.Resources>
    <Grid ShowGridLines="True">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" MinWidth="150"></ColumnDefinition>
            <ColumnDefinition Width="*"></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <StackPanel Grid.Column="0" x:Name="left" Orientation="Vertical">
            <Rectangle Width="80" Height="50" Fill="AliceBlue" Stroke="Black" Margin="5" x:Name="rectangle" MouseLeftButtonDown="rectangle_MouseLeftButtonDown"></Rectangle>
            <TextBlock Text="矩形"></TextBlock>
            <Rectangle Width="100" Height="100" Fill="AliceBlue" Stroke="Black" Margin="5" x:Name="rhombus" MouseLeftButtonDown="rhombus_MouseLeftButtonDown">
                <Rectangle.RenderTransform>
                    <TransformGroup>
                        <RotateTransform CenterX="50" CenterY="50" Angle="45"></RotateTransform>
                        <ScaleTransform CenterX="50" CenterY="50" ScaleX="0.5" ScaleY="0.7"></ScaleTransform>
                    </TransformGroup>
                </Rectangle.RenderTransform>
            </Rectangle>
            <TextBlock Text="菱形" Margin="0,5"></TextBlock>
            <Line X1="0" Y1="0" X2="0" Y2="80" Stroke="Black" StrokeThickness="2" HorizontalAlignment="Center" Margin="5" x:Name="line" MouseLeftButtonDown="line_MouseLeftButtonDown" ></Line>
            <TextBlock Text="直线"></TextBlock>
            <Ellipse Width="60" Height="60" Fill="AliceBlue" Stroke="Black" Margin="5" x:Name="circle" MouseLeftButtonDown="circle_MouseLeftButtonDown"></Ellipse>
            <TextBlock Text="圆形"></TextBlock>
        </StackPanel>
        <Canvas Grid.Column="1" x:Name="right" >


        </Canvas>
    </Grid>
</Window>

当点击左边基础控件时,在右边容器中,生成新的控件。如下所示:

namespace DemoVisio
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        /// <summary>
        /// 控件列表
        /// </summary>
        private List<Control> rightControls = new List<Control>();

        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_MouseDown(object sender, MouseButtonEventArgs e)
        {
            //this.Focus();
            //this.one.SetIsEnableInput(false);
            foreach (var control in this.right.Children) {
                var thumb = control as ThumbControl;
                if (thumb != null)
                {
                    thumb.SetIsEnableInput(false);
                }
            }
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            var width = this.right.ActualWidth;
            var height = this.right.ActualHeight;

            int x = 0;
            int y = 0;
            //横线
            while (y<height) {
                Line line = new Line();
                line.X1 = x;
                line.Y1 = y;
                line.X2 = width;
                line.Y2 = y;
                line.Stroke = Brushes.LightGray;
                line.StrokeThickness = 1;
                this.right.Children.Add(line);
                y = y + 10;
            }
            //重新初始化值
            x = 0;
            y = 0;
            //竖线
            while (x < width) {
                Line line = new Line();
                line.X1 = x;
                line.Y1 = y;
                line.X2 = x;
                line.Y2 = height;
                line.Stroke = Brushes.LightGray;
                line.StrokeThickness = 1;
                this.right.Children.Add(line);
                x = x + 10;
            }
        }

        private void rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            SquareControl squareControl = new SquareControl();
            this.right.Children.Add(squareControl);
        }

        private void rhombus_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            RhombusControl rhombusControl = new RhombusControl();
            this.right.Children.Add(rhombusControl);
        }

        private void line_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            LineArrowControl lineArrowControl = new LineArrowControl();
            this.right.Children.Add(lineArrowControl);
        }

        private void circle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            CircleControl circleControl = new CircleControl();
            this.right.Children.Add(circleControl);
        }
    }
}

示例截图

示例基础截图如下所示:

走进WPF之开发类似Visio软件

备注

以上示例只是基础,功能并不完善,旨在抛砖引玉,共同学习,一起进步,希望可以对大家有所启发。

贺新郎·九日

【作者】刘克庄 【朝代】宋

湛湛长空黑。更那堪、斜风细雨,乱愁如织。

老眼平生空四海,赖有高楼百尺。

看浩荡、千崖秋色。

白发书生神州泪,尽凄凉、不向牛山滴。

追往事,去无迹。


少年自负凌云笔。到而今、春华落尽,满怀萧瑟。

常恨世人新意少,爱说南朝狂客。

把破帽、年年拈出。

若对黄花孤负酒,怕黄花、也笑人岑寂。

鸿北去,日西匿。文章来源地址https://www.toymoban.com/news/detail-512361.html

到了这里,关于走进WPF之开发类似Visio软件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt (高仿Visio)流程图组件开发(七) 流程图 简单操作界面搭建

    Qt (高仿Visio)流程图组件开发(一) 效果展示及基本开发框架构思 Qt (高仿Visio)流程图组件开发(二) 基本图元绘制 图元间连线绘制 Qt (高仿Visio)流程图组件开发(三) 图元基类如何定义,流程图多种图元类型实现 Qt (高仿Visio)流程图组件开发(四) 流程图 图元

    2023年04月25日
    浏览(38)
  • 用Python做一个软件,你想看的视频可以能看 ~ 当然必须是正经的

    最近很喜欢看一部剧叫《某朝诡事录》,刚开始看前几集真的很喜欢,但是后面的都得要会员,问了周边一圈人,都没有某艺的… 所以,我就自己用Python琢磨出了一个软件,可以直接看这些视频,这就很nice 主要是最近疫情又严重点了,像我这种不打游戏的,只能开启追剧生

    2024年02月02日
    浏览(28)
  • 【Python】实现一个类似于Glass2k的Windows窗口透明化软件

            网上看到一款Windows下的窗口透明化工具Glass2k(Glass2k官网),可以简单地通过快捷键实现任意窗口的透明化,还挺方便的,想用Python自己实现一下类似的功能。          软件已经开源到 :窗口透明化小工具开源地址         效果图如下:         工具包含以

    2024年02月22日
    浏览(25)
  • 视频批量混剪剪辑软件类似剪映设计一个模板后, 视频,图片,文字,转场,音频,特效都可以系统随机

    随着自媒体时代的到来,越来越多的人加入到了视频创作行列。然而,视频剪辑是一项繁琐的任务,特别是当你需要批量处理多个视频时。为了提高效率,一款名为“视频闪闪”的批量剪辑软件应运而生。 www.shipinshanshan.com “视频闪闪”具备多种功能,如视频分割、合并、转

    2024年02月05日
    浏览(44)
  • WPF实现类似ChatGPT的逐字打印效果

    前一段时间ChatGPT类的应用十分火爆,这类应用在回答用户的问题时逐字打印输出,像极了真人打字回复消息。出于对这个效果的兴趣,决定用WPF模拟这个效果。 真实的ChatGPT逐字输出效果涉及其语言生成模型原理以及服务端与前端通信机制,本文不做过多阐述,重点是如何用

    2024年02月13日
    浏览(29)
  • 使用arcgis pro是类似的控件样式 WPF

    2024年01月18日
    浏览(33)
  • WPF开发一个可以自适应排列的Panel控件

    一.控件介绍     初看标题可能无法理解,我们看看什么是自适应排列。 乍一看它有点像WrapPanel控件,都是从左至右排列,如果一行排列不下就换行继续排列,但是细看你就会发现不对,WrapPanel控件行尾是不会对齐的,也就是说只要WrapPanel的子控件的宽度不一致,每一行的

    2024年04月08日
    浏览(39)
  • .NET6: 开发基于WPF的摩登三维工业软件 (7)

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 做为一个摩登的工业软件,提供可编程的脚本能力是必不可少的能力。脚本既可以方便用户进行二次开发,也对方便对程序进行自动化测试。本文将结合

    2024年02月05日
    浏览(34)
  • 一个WPF开发的、界面简洁漂亮的音频播放器

    今天推荐一个界面简洁、美观的、支持国际化开源音频播放器。 这是一个基于C# + WPF开发的,界面外观简洁大方,操作体验良好的音频播放器。 支持各种音频格式,包括:MP4、WMA、OGG、FLAC、M4A、AAC、WAV、APE 和 OPUS;支持标记、实时显示歌词等功能;支持换肤、中英文等主流

    2024年02月01日
    浏览(37)
  • 你想使用域名访问一个ip的网页,你应该怎么办呢?

    1.首先,如果你是服务器的 管理者 ,你需要在服务器的官网申请一个test.com的域名,然后在官网将域名映射到1.1.1.1上. 2.接下来, 使用者 或 管理者 都可以做了: 你只需要修改 /etc/nginx/nginx.conf 里面的 server_name , 改成 server_name test.com; 即可 3.经过第二步的操作, (至此,)你就可以用 ht

    2024年01月23日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包