现代桌面UI框架科普及WPF入门1

现代桌面UI框架科普及WPF入门

文章目录

  • 现代桌面UI框架科普及WPF入门
    • 桌面应用程序框架介绍
      • 过时的UI框架
        • MFC (Microsoft Foundation Class)
        • 缺点
      • 经典的UI框架
        • **WinForms**
        • **QT**
        • **WPF**
      • 未来的UI框架
        • **MAUI**
        • **AvaloniaUI**
    • WPF相对于Winform,QT,MFC的独立优势
    • WPF的基本概念
    • WPF 编程模型
      • XAML
      • 依赖项和附加属性
    • 实操
      • 创建项目
        • 关键字说明
        • 尝试添加控件
        • 尝试添加响应事件
      • 数据绑定
      • 模板
      • 丰富的开源UI库支持

桌面应用程序框架介绍

过时的UI框架

MFC
语言:C++

MFC (Microsoft Foundation Class)

以C++类的形式封装了Windows API,并且包含一个应用程序框架。类中包含了大量的windows句柄封装类和很多windows的组件和内建控件的封装类。MFC把Windows SDK API函数包装成了几百个类,MFC给Windows系统提供面向对象的接口。

缺点
  1. 技术老化:MFC是一个非常老的框架,最早发布于1992年。随着时间的推移,新的技术和框架不断涌现,MFC显得过时
  2. 开发效率低:相比于现代的开发框架,MFC的开发效率较低。它基于C++,需要编写大量的代码来实现一些基本功能,而现代框架如WPF和WinForms则提供了更高层次的抽象和更丰富的控件库

经典的UI框架

WinForms

语言:C#
WinForms (Windows Forms)
微软在2001年随NET Framework和Visual Studio首次发布的图形用户界面(GUI)类库。它的设计初衷是简化Windows桌面应用程序的开发,使企业开发者无需精通C++也能创建数据驱动的业务应用²。

主要特点

  • 易用性:WinForms提供了大量的控件和事件处理机制,简化了用户界面开发。

缺点

  1. 技术老化:WinForms最早发布于2001年,虽然在当时是一个非常先进的技术,但随着时间的推移,新的技术和框架不断涌现,WinForms显得过时

  2. 功能限制:相比于现代的框架如WPF和UWP,WinForms在功能和灵活性上存在一定的限制。例如,WinForms在处理复杂的UI和动画效果时显得力不从心

  3. 跨平台支持不足:WinForms主要用于Windows平台,而现代应用程序往往需要跨平台支持。虽然通过Mono项目可以在其他操作系统上运行WinForms,但其跨平台能力仍然有限

QT

语言:C++
Qt最早由挪威的两位程序员Eirik Chambe-Eng和Haavard Nord于1991年开发。Qt的第一个公众预览版于1995年发布。

应用领域
Qt作为一个跨平台的C++应用程序开发框架,广泛应用于以下领域:

  • 桌面应用:支持Windows、macOS和Linux等操作系统,适合开发复杂的桌面应用程序。
  • 移动应用:支持Android和iOS,适合开发高性能的移动应用。
  • 嵌入式系统:在汽车、医疗设备和工业控制等领域有广泛应用。
  • 物联网:在智能家居、智能制造等物联网领域崭露头角。
WPF

语言:C#
Windows Presentation Foundation (WPF) 是由微软开发的用户界面框架,最早发布于2006年,作为 .NET Framework 3.0 的一部分。WPF 的设计初衷是提供一个现代化的、基于矢量图形的渲染引擎,能够充分利用现代图形硬件的加速能力。2018年,微软将WPF开源,并在GitHub上发布,采用MIT许可证。

应用领域
WPF广泛应用于各种Windows桌面应用程序的开发,以下是一些主要的应用领域:

  1. 企业级应用:WPF在企业级应用开发中非常流行,特别是需要复杂用户界面和数据绑定的应用。
  2. 多媒体应用:由于其强大的图形和动画支持,WPF适合开发多媒体应用,如视频播放器和图形编辑器。
  3. 数据可视化:WPF的矢量图形和数据绑定功能使其非常适合用于数据可视化和仪表盘应用。
  4. 教育和培训软件:WPF的动画和多媒体功能使其成为开发教育和培训软件的理想选择。

WPF的强大功能和灵活性使其成为开发现代化Windows应用程序的首选框架之一。

未来的UI框架

MAUI

语言:C#
MAUI (Multi-platform App UI)

  • 功能:支持iOS、Android、macOS和Windows平台,使用单一代码库构建原生用户界面
  • 特点:利用每个平台的原生UI工具包,确保应用在各平台上都有原生的外观和感觉
AvaloniaUI

语言:C#

  • 功能:支持Windows、macOS、Linux、WebAssembly等平台,使用XAML进行界面设计
  • 特点:使用Skia图形引擎进行自定义渲染,提供一致的跨平台用户界面

WPF相对于Winform,QT,MFC的独立优势

  1. XAML:XAML 是 WPF 的标记语言,它是一种基于 XML 的标记语言,用于定义应用程序的用户界面。XAML 允许开发人员以声明方式创建 UI 元素,并使用数据绑定、命令、样式和模板等特性来实现动态 UI。
  2. 依赖项和附加属性:依赖项属性是 WPF 的一种属性系统,它允许控件和其他元素通过属性来进行通信,并提供一种简单、一致的属性系统。
  3. 样式和模板:样式和模板是 WPF 的可视化机制,它们允许开发人员创建一致的外观和感觉。样式可以应用到控件、应用程序、窗口或整个应用程序的范围内,而模板可以应用到控件的各个部分。
  4. 命令:命令是 WPF 的交互模型,它允许开发人员创建可重用的交互逻辑,并与控件、路由事件和数据绑定相结合。

WPF的基本概念

Windows Presentation Foundation (WPF) 是微软开发的一种用于构建 Windows 桌面应用程序的框架。它提供了丰富的图形功能、数据绑定和自定义控件等特性。以下是 WPF 的一些基本概念:

  1. 矢量图形引擎:WPF 的核心是一个与分辨率无关且基于矢量的呈现引擎,旨在充分利用现代图形硬件。
  2. XAML:可扩展应用程序标记语言 (XAML) 是一种基于 XML 的标记语言,用于定义应用程序的用户界面。XAML 允许开发人员以声明方式创建 UI 元素。
  3. 数据绑定:WPF 提供了强大的数据绑定功能,可以轻松地将 UI 元素与数据源连接起来,实现数据的动态更新。
  4. 控件:WPF 包含一套丰富的控件库,如按钮、文本框、列表框等,开发人员可以使用这些控件构建复杂的用户界面。
  5. 布局:WPF 提供了多种布局容器,如 Grid、StackPanel 和 Canvas,帮助开发人员灵活地安排 UI 元素的位置和大小。
  6. 动画和图形:WPF 支持二维和三维图形,以及动画效果,使得应用程序的界面更加生动。

WPF 编程模型

WPF 编程模型包含以下主要组件:

  1. 应用程序对象:应用程序对象是 WPF 应用程序的入口点,它负责创建应用程序的主窗口、资源、路由事件和其他应用程序级的设置。
  2. 窗口对象:窗口对象是 WPF 应用程序的主要 UI 容器,它包含应用程序的主要 UI 元素,如菜单、工具栏、状态栏、标题栏、内容区域等。
  3. 控件:控件是 WPF 应用程序的主要 UI 元素,它们提供丰富的功能和可视化效果,如按钮、文本框、列表框、菜单、对话框等。
  4. 资源:资源是 WPF 应用程序的外部数据,如颜色、字体、图片、样式、数据模板等。
  5. 路由事件:路由事件是 WPF 应用程序的事件模型,它允许控件和应用程序对象之间进行通信,并提供一种简单、一致的事件处理机制。
  6. 数据绑定:数据绑定是 WPF 应用程序的核心功能,它允许开发人员将 UI 元素与数据源绑定起来,实现数据的动态更新。
  7. 样式和模板:样式和模板是 WPF 应用程序的可视化机制,它们允许开发人员创建一致的外观和感觉。
  8. 命令:命令是 WPF 应用程序的交互模型,它允许开发人员创建可重用的交互逻辑,并与控件、路由事件和数据绑定相结合。

XAML

语法:xml

<Windowx:Class="WpfApp1.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:local="clr-namespace:WpfApp1"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"Title="MainWindow"Width="800"Height="450"WindowStartupLocation="CenterScreen"mc:Ignorable="d"><Grid><Button Content="Click Me" /></Grid>
</Window>

依赖项和附加属性

依赖属性:

为什么要有依赖属性?
The main difference is, that the value of a normal .NET property is read directly from a private member in your class, whereas the value of a DependencyProperty is resolved dynamically when calling the GetValue() method that is inherited from DependencyObject.

When you set a value of a dependency property it is not stored in a field of your object, but in a dictionary of keys and values provided by the base class DependencyObject. The key of an entry is the name of the property and the value is the value you want to set.

The advantages of dependency properties are

Reduced memory footprint:
It’s a huge dissipation to store a field for each property when you think that over 90% of the properties of a UI control typically stay at its initial values. Dependency properties solve these problems by only store modified properties in the instance. The default values are stored once within the dependency property.
Value inheritance:
When you access a dependency property the value is resolved by using a value resolution strategy. If no local value is set, the dependency property navigates up the logical tree until it finds a value. When you set the FontSize on the root element it applies to all textblocks below except you override the value.
Change notification:
Dependency properties have a built-in change notification mechanism. By registering a callback in the property metadata you get notified, when the value of the property has been changed. This is also used by the databinding.
check the below url for more details about the magic behid it

大意:依赖属性是一种特殊的属性,它的值是动态计算的,而不是直接存储在对象实例的字段中。依赖属性的值存储在依赖对象基类 DependencyObject 提供的字典中,字典的键是属性的名称,值是要设置的值。依赖属性的优点有:

  • 内存占用减少:依赖属性仅存储修改过的值,而不是每个属性都存储一个字段。默认值只存储一次,而不是每个实例都存储。
  • 值继承:当访问依赖属性时,值是根据值解析策略进行计算的。如果没有本地值,则依赖属性沿着逻辑树向上搜索,直到找到值。当在根元素上设置 FontSize 时,它将应用于所有文本块,除非您覆盖值。
  • 通知更改:依赖属性具有内置的更改通知机制。通过在属性元数据中注册回调,可以获得有关属性值更改的通知。这也用于数据绑定。

具体参考:stackoverflow

主要作用:

  1. 可以在代码或 XAML 中设置属性。
<Button Content="I am red" Background="Red"/>

或者设置复杂的属性值

<Button Content="I have an image background"><Button.Background><ImageBrush ImageSource="stripes.jpg"/></Button.Background>
</Button>

在代码中设置

Button myButton = new();
myButton.Width = 200.0;
  1. 设置资源
<StackPanel.Resources><SolidColorBrush x:Key="MyBrush" Color="Gold"/>
</StackPanel.Resources>
  1. 绑定数据
<Button Content="{Binding text}"/>

4.绑定样式

<Style x:Key="GreenButtonStyle"><Setter Property="Control.Background" Value="Green"/>
</Style>

使用

<Button Style="{StaticResource GreenButtonStyle}" Content="I am green"/>

附加属性:
附加属性是一个 Extensible Application Markup Language (XAML) 概念。 附加属性允许为派生自 DependencyObject 的任何 XAML 元素设置额外的属性/值对,即使该元素未在其对象模型中定义这些额外的属性。 额外的属性可进行全局访问。 附加属性通常定义为没有常规属性包装器的依赖属性的专用形式。

附加属性允许子元素为父元素中定义的属性指定唯一值。 一个常见方案是,一个子元素指定它应如何被其父元素呈现在 UI 中。 例如,DockPanel.Dock 是一个附加属性,因为它在 DockPanel 的子元素上设置,而不是在 DockPanel 本身设置。 DockPanel 类定义名为 DockProperty 的静态 DependencyProperty 字段,然后提供 GetDockSetDock 方法作为附加属性的公共访问器。

<DockPanel><TextBox DockPanel.Dock="Top">Enter text</TextBox>
</DockPanel>

实操

创建项目

关于Net Framework和Net Core、Net

[详情](.NET Standard - .NET | Microsoft Learn)

运行平台语言版本支持平台著名框架
WindowsC# 7.3.NET FrameworkWPF,WinForms,ASP.NET
Windows,macOS,LinuxC# 8+.NET CoreWPF,WinForms,ASP.NET Core
Windows,macOS,LinuxC# 9+.NET 5,6,7,8,9WPF,WinForms,MAUI,Uno Platform,Avalonia UI, ASP.Net Core

在这里插入图片描述

MainWindow.xaml:

<Windowx:Class="WpfApp1.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:local="clr-namespace:WpfApp1"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"Title="MainWindow"Width="800"Height="450"WindowStartupLocation="CenterScreen"mc:Ignorable="d"><Grid></Grid>
</Window>

作用:前端文件,定义了窗口的基本结构,包括窗口的大小、位置、标题、背景色等。

MainWindow.xaml.cs:

namespace WpfApp1
{public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}}
}

作用:后端文件,定义了窗口的行为,包括按钮的点击事件、文本框的输入事件等。

App.xaml:

<Applicationx:Class="WpfApp1.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:WpfApp1" StartupUri="MainWindow.xaml"><Application.Resources></Application.Resources>
</Application>

作用:定义了应用程序的基本结构,包括资源、主题等。

App.xaml.cs:

namespace WpfApp1
{public partial class App : Application{}
}

作用:定义了应用程序的行为,包括启动事件等。

关键字说明

xmlns:XML 命名空间,用于定义 XML 文档中的元素、属性和指令。
xmlns:x:XAML 命名空间,用于定义 XAML 文档中的元素、属性和指令。
xmlns:d:Blend 命名空间,用于定义 Blend 文档中的元素、属性和指令。
xmlns:local:本地命名空间,用于定义当前文档中的元素、属性和指令。
xmlns:mc:标记兼容性命名空间,用于定义标记兼容性文档中的元素、属性和指令。
x:Class:XAML 类,用于指定当前 XAML 文件的类。
mc:Ignorable:标记兼容性忽略,用于指定标记兼容性文档中可以忽略的元素。

尝试添加控件
<Grid Margin="5"><Grid.RowDefinitions><RowDefinition Height="auto" /><RowDefinition Height="auto" /><RowDefinition Height="auto" /></Grid.RowDefinitions><Grid Margin="5"><Grid.ColumnDefinitions><ColumnDefinition Width=".3*" /><ColumnDefinition Width=".7*" /></Grid.ColumnDefinitions><TextBlock VerticalAlignment="Center" Text="UserName" TextAlignment="Right" /><TextBox Grid.Column="1" Margin="25,0,0,0" /></Grid><Grid Grid.Row="1" Margin="5"><Grid.ColumnDefinitions><ColumnDefinition Width=".3*" /><ColumnDefinition Width=".7*" /></Grid.ColumnDefinitions><TextBlock VerticalAlignment="Center" Text="Password" TextAlignment="Right" /><TextBox Grid.Column="1" Margin="25,0,0,0" /></Grid><Button Grid.Row="2" Margin="5,10" Content="Login" />
</Grid>

在这里插入图片描述

尝试添加响应事件

为了实现登录功能,我们需要在按钮的 Click 事件中编写代码。

前台代码

<Grid Margin="5"><Grid.RowDefinitions><RowDefinition Height="auto" /><RowDefinition Height="auto" /><RowDefinition Height="auto" /></Grid.RowDefinitions><Grid Margin="5"><Grid.ColumnDefinitions><ColumnDefinition Width=".3*" /><ColumnDefinition Width=".7*" /></Grid.ColumnDefinitions><TextBlock VerticalAlignment="Center" Text="UserName" TextAlignment="Right" /><TextBox x:Name="TextBoxUserName" Grid.Column="1" Margin="25,0,0,0" /></Grid><Grid Grid.Row="1" Margin="5"><Grid.ColumnDefinitions><ColumnDefinition Width=".3*" /><ColumnDefinition Width=".7*" /></Grid.ColumnDefinitions><TextBlock VerticalAlignment="Center" Text="Password" TextAlignment="Right" /><TextBox x:Name="TextBoxPassword" Grid.Column="1" Margin="25,0,0,0" /></Grid><Buttonx:Name="ButtonLogin"Grid.Row="2"Margin="5,10"Click="ButtonLogin_Click"Content="Login" />
</Grid>

后台代码

public partial class MainWindow : Window
{public MainWindow(){InitializeComponent();}private void ButtonLogin_Click(object sender, RoutedEventArgs e){var username = TextBoxUserName.Text;var password = TextBoxPassword.Text;if (username == "admin" && password == "password"){MessageBox.Show("Login successful!");}else{MessageBox.Show("Invalid username or password!");}}
}

数据绑定

数据绑定是 WPF 应用程序的重要特性之一,它允许开发人员在 UI 元素和数据源之间建立双向绑定。

为什么要数据绑定

请问在Winform或者QT中如何实现以下效果?
假设存在MinValueMaxValue两个值,分别代表最小值和最大值,现在需要实现2个滑动条以及2个输入框分别对应2个值,并且当最小值超过最大值时,可以自动调整最大值,反之亦然。

在这里插入图片描述

如果在此基础上,再加上MinRangeMaxRange的设置,不使用现代UI框架的阁下又该如何是好?

在这里插入图片描述

使用WPF后,我们只需要关心业务,而不用像Winform或者QT一样频繁关注控件的ValueChanged事件,以及各个事件的互锁

<StackPanel Orientation="Vertical"><materialDesign:NumericUpDown Margin="5" Maximum="{Binding MaxRange}" Minimum="{Binding MinRange}" Value="{Binding MinValue, Mode=TwoWay}" /><Slider Margin="5" Maximum="{Binding MaxRange}" Minimum="{Binding MinRange}" Value="{Binding MinValue, Mode=TwoWay}" /><materialDesign:NumericUpDown Margin="5" Maximum="{Binding MaxRange}" Minimum="{Binding MinRange}" Value="{Binding MaxValue, Mode=TwoWay}" /><Slider Margin="5" Maximum="{Binding MaxRange}" Minimum="{Binding MinRange}" Value="{Binding MaxValue, Mode=TwoWay}" /><Separator Margin="5" /><TextBlock Margin="5,5" Text="最小值设置" /><materialDesign:NumericUpDown Margin="5,0" Maximum="9999" Minimum="-9999" Value="{Binding MinRange}" /><TextBlock Margin="5,0" Text="最大值设置" /><materialDesign:NumericUpDown Margin="5,0" Maximum="9999" Minimum="-9999" Value="{Binding MaxRange}" />
</StackPanel>
public partial class MainWindow : Window, INotifyPropertyChanged
{public event PropertyChangedEventHandler? PropertyChanged;public MainWindow(){InitializeComponent();this.DataContext = this;}private int minValue = 50;public int MinValue{get { return minValue; }set{minValue = value;RaisePropertyChanged();if (value > maxValue)MaxValue = value;}}private int maxValue = 128;public int MaxValue{get => maxValue;set{maxValue = value;RaisePropertyChanged();if (value < minValue)MinValue = value;}}private int maxRange = 255;public int MaxRange{get => maxRange;set{maxRange = value;RaisePropertyChanged();if (MaxValue < value)MaxValue = value;}}private int minRange = 0;public int MinRange{get => minRange;set{minRange = value;RaisePropertyChanged();if (MinValue < value)MinValue = value;}}void RaisePropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName = "") => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

模板

DataTemplate:用于定义数据的显示方式。

如何使用Winform实现以下表格?
复杂程度不在赘述

在这里插入图片描述

public List<Student> Students { get; set; } = new();public class Student
{public string Name { get; set; }public int Age { get; set; }public string Address { get; set; }public bool IsMale { get; set; }
}

前端部分

<DataGrid ItemsSource="{Binding Students}" />

甚至是自动适配枚举

public enum EClassType
{kindergarten,Elementary,Junior,Senior,University
}

在这里插入图片描述

如果使用了第三方库

在这里插入图片描述

丰富的开源UI库支持

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/149782.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

1.1 elasticsearch分布式集群基本搭建(centos7.x + elaticsearch7.11.1)

【1】分布式分片集群基础概念 【1.1】ES的分布式集群有什么用&#xff1f; 高可用 高可用(High Availability)是分布式系统架构设计中必须考虑的因素之一&#xff0c;它通常是指&#xff0c;通过设计减少系统不能提供服务的时间。如果系统每运行100个时间单位&#xff0c;会有…

ubuntu22.04磁盘挂载(多磁盘和单磁盘挂载)

多磁盘挂载到同一个目录 # 如果没有安装逻辑卷管理系统工具sudo apt install lvm2 # 查看磁盘分区sudo fdisk -l # 新建物理卷sudo pvcreate /dev/nvme0n1 /dev/nvme1n1 # 查看现有物理卷信息sudo pvdisplay # 新建物理卷sudo vgcreate dnyjy_vg /dev/nvme0n1 /dev/nvme1n1…

微服务之服务保护

Sentinel引入Java项目中 一&#xff1a;安装Sentinel 官网地址&#xff1a;https://github.com/alibaba/Sentinel/releases 二&#xff1a;安装好后在sentinel-dashboard.jar所在目录运行终端 三&#xff1a;运行命令&#xff0c;端口自己指定 java -Dserver.port8090 -Dcs…

Unity 热更新(HybridCLR+Addressable)-资源更新

七、资源更新 创建一个叫Aot的文件夹&#xff0c;用来存放不会热更新的资源 这个修改为第三个 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b8be5e6465184ad5ad6173c6870bfa06.png 这个是更新 在更新或者打包时遇到端口被占的报错&#xff0c;不用理会&#xf…

frp内网穿透常见问题

Frp编译和部署比较复杂&#xff0c;多端口映射时或者连接数多的情况下会出现不稳定的现象&#xff0c;不适合小白使用&#xff0c;而且仅是上一代的内网穿透技术&#xff0c;生产环境使用建议选择稳定性比较高的产品&#xff0c;如神卓互联、花生壳等&#xff0c;都是采用C语言…

Springboot原理之bean的依赖功能、自动配置

1. Bean管理 Spring 当中提供的注解 Component 以及它的三个衍 生注解&#xff08; Controller 、 Service 、 Repository &#xff09;来声明 IOC 容器中的 bean 对象&#xff0c;同时我们也学 习了如何为应用程序注入运行时所需要依赖的 bean 对象&#xff0c;也就是依赖注…

电池快充协议芯片

1&#xff1a;18650充电快充规则 电池知识 | 东莞市恒帝电子科技有限公司 (heldee.com) 锂电池快速充电知识【钜大锂电】 (juda.cn)18 锂电池和18650锂电池能不能快速充电&#xff0c;四种充电方式讲解 | 东莞市恒帝电子科技有限公司 (heldee.com) 2&#xff1a;国产厂家 …

光子架与电子架 -- 主从子架

主从子架模式可以实现物理上的多个子架在网管上作为一个网元统一管理&#xff0c;这样可以节省IP资源与管理开销&#xff0c;方便维护。 主从子架级联模式 在主从子架模式下&#xff0c;仅主子架可以和网管相连。和网管相连的主子架所在网元为网关网元。主从子架支持树型级联和…

node-rtsp-stream、jsmpeg.min.js实现rtsp视频在web端播放

1. 服务地址&#xff08;私有&#xff09;&#xff1a;https://gitee.com/nnlss/video-node-server 2.node-rtsp-stream 需要安装FFMPEG&#xff1b; 3.给推拉流做了开关&#xff0c;可借助http请求&#xff0c;有更好方式可联系&#xff1b; 4.存在问题&#xff1a; 1&…

浅谈提示工程之In-context learning技术

提示工程之In-context learning技术&#xff1b; 通过一张图片围绕下边几个方面进行简单说明 概念起因本质结构注意事项 日常总结

C++(9.24)

头文件 #ifndef MY_STRING_H #define MY_STRING_H#include <iostream>class My_string { private:char *ptr; // 指向字符数组的指针int size; // 字符串的最大容量int len; // 字符串的当前长度public:My_string();My_string(const char *src);My_string(const My_s…

Error:Decorators are not valid here. 使用Angular中的装饰器

Decorators are not valid here&#xff0c;项目中出现这个提示信息&#xff0c;说明装饰器未知错误、或者在不支持的元素上使用了装饰器。 如下图所示&#xff0c;我在NgModule装饰器后面加了一个导出方法&#xff0c;加完之后控制台提示了如下错误&#xff1a;Error TS1206&a…

【python】横截面数据分析及可视化报告示例

问题描述 题目&#xff1a; 共享的数据文件夹包含 2 个外部文件。第一个文件 "project data.xls "涉及国家层面的数据&#xff08;2000-2019 年&#xff09;&#xff0c;变量大多摘自世界发展指标。变量解释在第二个文件中 创建一个模型&#xff0c;解释为什么一些国…

STM32基础学习笔记-SPI通讯协议协议面试基础题8

第八章、SPI : LCD屏 1、LCD是什么 &#xff1f;发光原理 &#xff1f; 1.LCD:液晶显示 当有电流的时候&#xff0c;液晶层中的物质会有序排列 没有电流的时候&#xff0c;无序排列&#xff0c;光不可以透过 当像素点只有黑/白色的时候&#xff0c;灰度图&#xff08;非黑即…

windows C++-同步数据结构与 Windows API

将并发运行时提供的同步数据结构的行为与 Windows API 提供的同步数据结构的行为进行比较。 并发运行时提供的同步数据结构遵循协作线程模型。 在协作线程模型中&#xff0c;同步基元显式将其处理资源传递给其他线程。 这与抢占式线程模型不同&#xff0c;其中处理资源由控制调…

RtspServer:轻量级RTSP服务器和推流器

文章目录 项目概述技术分析支持的编码格式传输方式心跳检测机制RTSP 推流安全性 架构分析RtspServer 整体架构流程分析1. 客户端连接和会话建立2. 媒体数据传输3. 心跳检测和连接维护 xop 基础库项目介绍功能特性xop 整体架构 应用场景社区问题收集与解答问题一&#xff1a;刚开…

【YOLO学习】YOLOv1详解

文章目录 1. 概述2. 算法流程3. 网络结构4. 损失函数 1. 概述 1. YOLO 的全称是 You Only Look Once: Unified, Real-Time Object Detection。YOLOv1 的核心思想就是利用整张图作为网络的输入&#xff0c;直接在输出层回归 bounding box 的位置和 bounding box 所属的类别。简单…

【AI创作组】Matlab中进行符号计算

提示:代码一定要自己运行过才算数…… 1. 符号计算工具箱介绍 1.1 工具箱功能 MATLAB的符号计算工具箱,即Symbolic Math Toolbox,是一套强大的数学软件工具,它使得MATLAB具备了符号运算的能力。该工具箱提供了一系列函数,用于求解、绘制和操作符号数学方程。用户可以直接…

深度学习之表示学习 - 半监督解释因果关系篇

序言 在深度学习的广阔领域中&#xff0c;表示学习&#xff08; Representation Learning \text{Representation Learning} Representation Learning&#xff09;与半监督学习&#xff08; Semi-supervised Learning \text{Semi-supervised Learning} Semi-supervised Learnin…

C++:deque的底层原理

一、deque是是双端队列。 deque(双端队列)&#xff1a;是一种双开口的"连续"空间的数据结构&#xff0c;双开口的含义是&#xff1a;可以在头尾两端进行插入和删除操作&#xff0c;且时间复杂度为O(1)&#xff0c;与vector比较&#xff0c;头插效率高&#xff0c;不…