在WPF中实现多语言切换的四种方式
在WPF中有多种方式可以实现多语言,这里提供几种常用的方式。
一、使用XML实现多语言切换
使用XML实现多语言的思路就是使用XML作为绑定的数据源。主要用到XmlDataProvider类.
使用XmlDataProvider.Source属性指定XML文件的路径或通过XmlDataProvider.Document指定XML文档对象,XmlDataProvider.XPath属性指定绑定的路径。
新建一个WPF工程,在debug目录下创建两个StrResource.xml文件,分别置于en-US和zh-CN文件夹
debug\en-US\StrResource.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <Language> 3 <Main_Title>Login Form</Main_Title> 4 <Main_UserName>UserName</Main_UserName> 5 <Main_Password>Password</Main_Password> 6 <Main_Button>Login</Main_Button> 7 <Window1_Title>Main Form</Window1_Title> 8 <Window1_Label>Welcome</Window1_Label> 9 </Language>
debug\zh-CN\StrResource.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <Language> 3 <Main_Title>登陆窗体</Main_Title> 4 <Main_UserName>用户名</Main_UserName> 5 <Main_Password>密码</Main_Password> 6 <Main_Button>登陆</Main_Button> 7 <Window1_Title>主界面</Window1_Title> 8 <Window1_Label>欢迎</Window1_Label> 9 </Language>
主窗体XAML
1 <StackPanel>2 <Label Content="{Binding XPath=Main_UserName}"></Label>3 <TextBox></TextBox>4 <Label Name="Password" Content="{Binding XPath=Main_Password}"></Label>5 <TextBox></TextBox>6 <Button Height="20" Margin="10,5" Background="LightSkyBlue" Name="Login" Content="{Binding XPath=Main_Button}" Click="Login_Click"></Button>7 <ComboBox Name="combox" SelectedIndex="0" SelectionChanged="combox_SelectionChanged">8 <ComboBoxItem>中文</ComboBoxItem>9 <ComboBoxItem>English</ComboBoxItem> 10 </ComboBox> 11 </StackPanel>
在后台代码中,将XmlDataProvider对象绑定到界面即可
1 XmlDocument doc = new XmlDocument(); 2 XmlDataProvider xdp = new XmlDataProvider(); 3 doc.Load("./zh-CN/language.xml"); //在切换语言时,重新加载xml文档,并重新绑定到界面即可 4 xdp.Document = doc; 5 xdp.XPath = @"/Language"; 6 this.DataContext = xdp;
运行效果如下:
二、使用资源字典实现多语言切换
资源字典的实现方式也比较简单,这是最常用的一种方式。
主要实现步骤是:将要显示的字符绑定到资源文件,然后在切换语言时用代码更改当前使用的资源文件即可。
创建一个WPF工程,添加一个language目录,再添加en-US和zh-CN目录。再分别在目录下创建资源字典文件,内容如下:
language\en-US.xaml
1 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"2 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"3 xmlns:s="clr-namespace:System;assembly=mscorlib">4 <s:String x:Key="Main.Title">Main Form</s:String>5 <s:String x:Key="Main.RibbonTab.Setting">Setting</s:String>6 <s:String x:Key="Main.RibbonGroup.Setting">All Setting</s:String>7 <s:String x:Key="Main.RibbonButton.Setting">Setting</s:String>8 <s:String x:Key="Main.RibbonButton.Setting.Title">Setting</s:String>9 <s:String x:Key="Main.RibbonButton.Setting.Description">All Setting Include Language</s:String> 10 <s:String x:Key="Setting.Title">Setting</s:String> 11 <s:String x:Key="Setting.Tab.Language">Language Setting</s:String> 12 <s:String x:Key="Setting.Tab.Label.ChooseLanguage">Please choose a language</s:String> 13 </ResourceDictionary>
language\zh-CN.xaml
1 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"2 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"3 xmlns:s="clr-namespace:System;assembly=mscorlib">4 <s:String x:Key="Main.Title">主界面</s:String>5 <s:String x:Key="Main.RibbonTab.Setting">设置</s:String>6 <s:String x:Key="Main.RibbonGroup.Setting">全部设置</s:String>7 <s:String x:Key="Main.RibbonButton.Setting">设置</s:String>8 <s:String x:Key="Main.RibbonButton.Setting.Title">设置</s:String>9 <s:String x:Key="Main.RibbonButton.Setting.Description">包括语言在内的全部设置</s:String> 10 <s:String x:Key="Setting.Title">设置</s:String> 11 <s:String x:Key="Setting.Tab.Language">语言设置</s:String> 12 <s:String x:Key="Setting.Tab.Label.ChooseLanguage">请选择一种语言</s:String> 13 </ResourceDictionary>
主窗体XAML
1 <TabControl>2 <TabItem Header="{DynamicResource Setting.Tab.Language}">3 <StackPanel>4 <TextBlock VerticalAlignment="Top" Margin="5,5,5,0" HorizontalAlignment="Left" Text="{DynamicResource Setting.Tab.Label.ChooseLanguage}">5 </TextBlock>6 <ComboBox Height="20" VerticalAlignment="Top" Margin="5,10" Width="200" HorizontalAlignment="Left" Name="combox_Language" SelectionChanged="combox_Language_SelectionChanged">7 <ComboBoxItem>中文</ComboBoxItem>8 <ComboBoxItem>English</ComboBoxItem>9 </ComboBox> 10 </StackPanel> 11 </TabItem> 12 </TabControl>
后台代码
private void combox_Language_SelectionChanged(object sender, SelectionChangedEventArgs e){ChangeLanguage(this.combox_Language.SelectedIndex);}/// <summary>/// 切换 语言/// </summary>/// <param name="index"></param>public void ChangeLanguage(int index){ResourceDictionary rd = new ResourceDictionary();switch(index){case 0:rd.Source = new Uri("Language/zh-CN.xaml", UriKind.Relative);break;case 1:rd.Source = new Uri("Language/en-US.xaml", UriKind.Relative);break;default:break;} Application.Current.Resources.MergedDictionaries[0] = rd;}
运行效果如下:
三、使用资源文件实现多语言切换
这种方式的实现也比较简单,也是将字符绑定到资源文件(.resx)
但需要注意的是,这种方式是静态的,不能实现动态切换。只能在启动时更改。
创建一个WPF工程,添加一个字符资源文件StrResources.resx作为默认的字符资源文件,再添加一个StrResources.zh-CN.resx做为中文字符资源(因为我用于演示的这台电脑系统是英文的)
注意:需要将访问修饰符改为public,否则运行会报错
主界面XAML
1 <Grid>2 <Label HorizontalAlignment="Left" VerticalAlignment="Top" Content="{x:Static local:StrResources.ChangeLanguage}"></Label>3 <ComboBox HorizontalAlignment="Left" VerticalAlignment="Top" Margin="120,5,0,0" Width="200" Name="combox_Culture">4 <ComboBoxItem Content="{x:Static local:StrResources.zh_CN}"></ComboBoxItem>5 <ComboBoxItem Content="{x:Static local:StrResources.en_US}"></ComboBoxItem>6 </ComboBox>7 8 <Button Content="{x:Static local:StrResources.OK}" Width="88" Height="28" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="0,0,120,0"/>9 <Button Content="{x:Static local:StrResources.Cancel}" Width="88" Height="28" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="0,0,10,0"/> 10 </Grid>
主界面后台逻辑
1 public partial class MainWindow : Window2 {3 public MainWindow()4 {5 InitializeComponent();6 7 LoadCulture();8 }9 10 public void LoadCulture() 11 { 12 if(CultureInfo.CurrentCulture.Name== "zh-CN") 13 { 14 combox_Culture.SelectedIndex = 0; 15 } 16 else 17 { 18 combox_Culture.SelectedIndex = 1; 19 } 20 } 21 }
在Application类的Startup事件中可以切换语言,但在程序运行后无法再切换
1 public partial class App : Application2 {3 private void Application_Startup(object sender, StartupEventArgs e)4 {5 //在这里可以更改语言6 ChangeCulture(0);7 }8 9 public void ChangeCulture(int index) 10 { 11 string cultureName = ""; 12 13 switch (index) 14 { 15 case 0: 16 cultureName = "zh-CN"; 17 break; 18 case 1: 19 cultureName = "en-US"; 20 break; 21 default: 22 cultureName = "en-US"; 23 break; 24 } 25 26 Thread.CurrentThread.CurrentCulture = new CultureInfo(cultureName); 27 Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureName); 28 } 29 }
运行效果:
四、使用json文件实现多语言切换
这种方式实现多语言切换有点麻烦,但可以使用json作为语言文件(其它格式文件其实也可以.txt .xml .csv)。
这种方式的实现原理是使用索引器方法查找每个字段值,然后绑定到界面上。支持动态切换
在debug目录下创建
zh-CN.json
1 { 2 "OK": "确定", 3 "Cancel": "取消", 4 "ChangeLanguage": "更改语言", 5 "zh_CN": "中文", 6 "en_US": "English" 7 }
en-US.json
1 { 2 "OK": "OK", 3 "Cancel": "Cancel", 4 "ChangeLanguage": "Change language", 5 "zh_CN": "中文", 6 "en_US": "English" 7 }
封装一个绑定通知类,这个类用于切换语言时,绑定的通知更新。
1 /// <summary>2 /// 绑定通知类3 /// </summary>4 public class NotifyPropertyChanged : INotifyPropertyChanged5 {6 public event PropertyChangedEventHandler PropertyChanged;7 8 protected void RaisePropertyChanged(string PropertyName)9 { 10 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(PropertyName)); 11 } 12 13 protected void OnPropertyChanged([CallerMemberName] string PropertyName = null) 14 { 15 RaisePropertyChanged(PropertyName); 16 } 17 18 protected void RaiseAllChanged() 19 { 20 RaisePropertyChanged(""); 21 } 22 }
创建一个语言字段类,这个类用于封装所有的语言字段。这一步确实就比较麻烦了,每个字段都得封装一个属性。
1 /// <summary>2 /// 语言字段类3 /// </summary>4 public class LanguageFields : NotifyPropertyChanged5 {6 /// <summary>7 /// 需要被重写的方法 用于获取语言字段值8 /// </summary>9 /// <param name="key"></param> 10 /// <returns></returns> 11 protected virtual string GetValue(string key) => ""; 12 13 protected virtual void SetValue(string Key, string value) { } 14 15 /// <summary> 16 /// 使用CallerMemberName特性传递当前属性名 17 /// </summary> 18 /// <param name="propertyName"></param> 19 /// <returns></returns> 20 string Get([CallerMemberName] string propertyName = null) 21 { 22 return GetValue(propertyName); 23 } 24 25 void Set(string value, [CallerMemberName] string propertyName = null) 26 { 27 SetValue(propertyName, value); 28 } 29 30 public string OK { get => Get(); set => Set(value); } 31 public string Cancel { get => Get(); set => Set(value); } 32 public string ChangeLanguage { get => Get(); set => Set(value); } 33 public string zh_CN { get => Get(); set => Set(value); } 34 public string en_US { get => Get(); set => Set(value); } 35 }
创建一个语言切换帮助类,这个类可以对当前使用的语言以及字段值进行操作
1 public class LanguageHelper : LanguageFields2 { 3 private JObject currentLanguage; //当前语言的JObject对象 4 private static readonly string dir = Environment.CurrentDirectory; //语言文件夹5 private CultureInfo currentCulture; //当前语言6 7 public static LanguageHelper Instance { get; } = new LanguageHelper();8 9 LanguageHelper() 10 { 11 CurrentCulture = CultureInfo.CurrentCulture; 12 } 13 14 /// <summary> 15 /// 当前语言属性 当值更新时,加载语言并更新绑定 16 /// </summary> 17 public CultureInfo CurrentCulture 18 { 19 get => currentCulture; 20 set 21 { 22 currentCulture = value; 23 CultureInfo.CurrentUICulture = value; 24 currentLanguage = LoadLang(value.Name); 25 LanguageChanged?.Invoke(value); 26 RaiseAllChanged(); 27 } 28 } 29 30 /// <summary> 31 /// 加载语言文件 32 /// </summary> 33 /// <param name="LanguageId"></param> 34 /// <returns></returns> 35 JObject LoadLang(string LanguageId) 36 { 37 try 38 { 39 var filePath = System.IO.Path.Combine(dir, $"{LanguageId}.json"); 40 return JObject.Parse(File.ReadAllText(filePath)); 41 } 42 catch 43 { 44 return new JObject(); 45 } 46 } 47 48 /// <summary> 49 /// 索引器方法 用于查找语言字段值 50 /// </summary> 51 /// <param name="Key"></param> 52 /// <returns></returns> 53 public string this[string Key] 54 { 55 get 56 { 57 if (Key == null) 58 return ""; 59 60 if (currentLanguage != null && currentLanguage.TryGetValue(Key, out var value) && value.ToString() is string s && !string.IsNullOrWhiteSpace(s)) 61 return s; 62 63 return Key; 64 } 65 } 66 67 /// <summary> 68 /// 重写 GetValue方法,调用索引器方法 69 /// </summary> 70 /// <param name="PropertyName"></param> 71 /// <returns></returns> 72 protected override string GetValue(string PropertyName) => this[PropertyName]; 73 74 /// <summary> 75 /// 语言更改事件 76 /// </summary> 77 public event Action<CultureInfo> LanguageChanged; 78 }
主窗体XAML
1 <Grid>2 <Label HorizontalAlignment="Left" VerticalAlignment="Top" Content="{Binding ChangeLanguage, Source={StaticResource LangManger}, Mode=OneWay}"></Label>3 <ComboBox HorizontalAlignment="Left" VerticalAlignment="Top" Margin="120,5,0,0" Width="200" Name="combox_Culture" SelectionChanged="combox_Culture_SelectionChanged">4 <ComboBoxItem Content="{Binding zh_CN, Source={StaticResource LangManger}, Mode=OneWay}"></ComboBoxItem>5 <ComboBoxItem Content="{Binding en_US, Source={StaticResource LangManger}, Mode=OneWay}"></ComboBoxItem>6 </ComboBox>7 8 <Button Content="{Binding OK, Source={StaticResource LangManger}, Mode=OneWay}" Width="88" Height="28" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="0,0,120,0"/>9 <Button Content="{Binding Cancel, Source={StaticResource LangManger}, Mode=OneWay}" Width="88" Height="28" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="0,0,10,0"/> 10 </Grid>
主窗体后台逻辑
软件启动时,加载当前语言。当下位框切换时,切换语言。
1 public partial class MainWindow : Window2 {3 public MainWindow()4 {5 InitializeComponent();6 7 LanguageHelper.Instance.LanguageChanged += Instance_LanguageChanged;8 LoadCulture(LanguageHelper.Instance.CurrentCulture);9 } 10 11 private void Instance_LanguageChanged(System.Globalization.CultureInfo obj) 12 { 13 //这里可以对语言更改进行处理 14 switch(obj.Name) 15 { 16 case "zh-CN": 17 break; 18 case "en-US": 19 break; 20 } 21 } 22 23 private void LoadCulture(System.Globalization.CultureInfo culture) 24 { 25 switch(culture.Name) 26 { 27 case "zh-CN": 28 combox_Culture.SelectedIndex = 0; 29 break; 30 case "en-US": 31 combox_Culture.SelectedIndex = 1; 32 break; 33 } 34 } 35 36 private void combox_Culture_SelectionChanged(object sender, SelectionChangedEventArgs e) 37 { 38 var culture = "zh-CN"; 39 40 switch(combox_Culture.SelectedIndex) 41 { 42 case 0: 43 culture = "zh-CN"; 44 break; 45 case 1: 46 culture = "en-US"; 47 break; 48 } 49 50 if (culture == null) 51 return; 52 53 LanguageHelper.Instance.CurrentCulture = new System.Globalization.CultureInfo(culture.ToString().Replace("_", "-")); //变量命名不支持 '-' ,所以这里需要替换一下 54 } 55 }
示例代码
https://github.com/zhaotianff/DotNetCoreWPF/tree/master/其它、实现多语言切换的几种方式/MultiLanguageDemo
相关文章:
在WPF中实现多语言切换的四种方式
在WPF中有多种方式可以实现多语言,这里提供几种常用的方式。 一、使用XML实现多语言切换 使用XML实现多语言的思路就是使用XML作为绑定的数据源。主要用到XmlDataProvider类. 使用XmlDataProvider.Source属性指定XML文件的路径或通过XmlDataProvider.Document指定…...
30min 的OpenCV learning Note
1.安装python和pycharm与环境搭配 打开Windows终端:(winR)(一般使用清华镜像网站安装库比较快) pip install opencv-contrib-python -i https://pypi.mirrors.ustc.edu.cn/simple 或者 python -m pip install open…...
C--编译和链接见解
欢迎各位看官!如果您觉得这篇文章对您有帮助的话 欢迎您分享给更多人哦 感谢大家的点赞收藏评论 感谢各位看官的支持!!! 一:翻译环境和运行环境 在ANSIIC的任何一种实现中,存在两个不同的环境1,…...
【QT Quick】基础语法:基础类与控件
QML 的基础类和控件中,我们可以看到主要的几个分类:基础控件类、窗口类以及组件类。以下是对这些控件及其属性、继承关系等的详细讲解: 控件关系总结 QtObject 是所有 QML 对象的基类。它定义了基础属性,主要用于逻辑和数据封装…...
使用 SSH 连接 Docker 服务器:IntelliJ IDEA 高效配置与操作指南
使用 SSH 连接 Docker 服务器:IntelliJ IDEA 高效配置与操作指南 本文详细介绍了如何在 2375 端口未开放的情况下,通过 SSH 连接 Docker 服务器并在 Idea 中进行开发。通过修改用户权限、生成密钥对以及配置 SSH 访问,用户可以安全地远程操作…...
Gas费用是什么?
Gas费用是什么? 每5个Byte 需要1个GasGasLimit 用来限制合约最多执行多少次运算GasPrice 每次计算需要支付的费用在Web3的语境中,尤其是在以太坊(Ethereum)这样的区块链平台上,Gas费是一个核心概念。以下是关于Gas费的详细解释: 1. 定义 Gas是以太坊网络上的计算单位,…...
大语言模型(LLM)的子模块拆拆分进行联邦学习;大语言模型按照多头(Multi-Head)拆分进行联邦学习
目录 大语言模型(LLM)的子模块拆拆分进行联邦学习 方式概述 简单示例 大语言模型按照多头(Multi-Head)拆分进行联邦学习 场景设定 多头拆分与联邦学习 示例说明 大语言模型(LLM)的子模块拆拆分进行联邦学习 大语言模型(LLM)的子模块拆分进行联邦学习,主要涉及…...
Qt 概述
1. Qlabel HelloWorld 程序 使用纯代码实现 // widget.cpp Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);// 给当前这个lable对象,指定一个父对象QLabel* label new QLabel(this);// C语言风格的字符串可以直接…...
移动应用的界面配置-手机银行APP
设置登录界面为线性布局,组件垂直居中排列设置主页为滚动模式,包括布局、添加背景图片设置按钮样式,包括形状、边框线的宽度和颜色 设置登录界面 设置界面为线性布局,组件垂直居中排列 --android:gravity"center_vertical…...
微服务nginx解析部署使用全流程
目录 1、nginx介绍 1、简介 2、反向代理 3、负载均衡 2、安装nginx 1、下载nginx 2、解压nginx安装包 3、安装nginx编辑 1、执行configure命令 2、执行make命令 4、启动nginx 1、查找nginx位置并启动 2、常用命令 3、反向代理 1、介绍反向代理配置 1、基础配置…...
华硕天选笔记本外接音箱没有声音
系列文章目录 文章目录 系列文章目录一.前言二.解决方法第一种方法第二种方法 一.前言 华硕天选笔记本外接音箱没有声音,在插上外接音箱时,系统会自动弹出下图窗口 二.解决方法 第一种方法 在我的电脑上选择 Headphone Speaker Out Headset 这三个选项…...
Unity中Socket_TCP异步连接,加入断线检测以及重连功能
1、服务端 using System; using System.Collections.Generic; using System.Text; #region 命名空间 using System.Net; using System.Net.Sockets; using System.Threading; using UnityEngine; #endregionnamespace AsynServerConsole {/// <summary>/// Tcp协议异步通…...
Android build子系统(01)Ninja构建系统解读
说明:本文将解读Ninja构建系统,这是当前Android Framework中广泛使用的构建工具。我们将从Ninja的起源和背景信息开始,逐步解读Ninja的优势和核心原理,并探讨其一般使用场景。然后介绍其在Android Framework中的应用及相关工具&am…...
徐老师的吉祥数
题目背景 文件读写 输入文件avoid.in 输出文件avoid.out 限制 1000ms 512MB 题目描述 众所周知, 3这个数字在有些时候不是很吉利,因为它谐音为 “散” 所以徐老师认为只要是 3的整数次幂的数字就不吉利 现在徐老师想知道,在某个范围[l,r] …...
使用html写一个能发起请求的登录界面
目录 head部分 内联样式部分 body部分 login-form类的div myModal类的div id script部分 总的代码 界面与操作演示 <!DOCTYPE html> <html lang"en"> <!DOCTYPE html> 这是文档类型声明,告诉浏览器这是一个 HTML文档。 <…...
五子棋双人对战项目(2)——登录模块
目录 一、数据库模块 1、创建数据库 2、使用MyBatis连接并操作数据库 编写后端数据库代码 二、约定前后端交互接口 三、后端代码编写 文件路径如下: UserAPI: UserMapper: 四、前端代码 登录页面 login.html: 注册页面…...
几种操作系统和几种cpu
常见的操作系统:windows,linux,macOS,统信,deepin,raspberry,andriod,iOS,鸿蒙,等等。 常见的cpu:intel,amd,龙芯&#x…...
[Cocoa]_[初级]_[使用NSNotificationCenter作为目标观察者实现时需要注意的事项]
场景 在开发Cocoa程序时,由于界面是用Objective-C写的。无法使用C的目标观察者[1]类。如果是使用第二种方案2[2],那么也需要增加一个代理类。那么有没有更省事的办法? 说明 开发界面的时候,经常是需要在子界面里传递数据给主界面࿰…...
彩虹易支付最新版源码及安装教程(修复BUG+新增加订单投诉功能)
该源码当前版本为较新的版本,新增了订单投诉功能和一套精美的二次元模板。 此版本为全开源版本,所有文件均未加密。系统默认安装完成后无法直接打开,需要进一步配置。 本站特别针对BUG文件进行了修复,且在PHP7.4环境下表现良好。…...
ping香港服务器超时的原因通常有哪些?
Ping命令用于测试计算机与目标服务器之间的网络连接。当您在尝试使用ping命令检测服务器时遇到超时的情况,通常可能是由以下原因造成的: 1. 网络连接问题: - 本地网络故障:如网线损坏、路由器故障或配置不当。 - ISP(互联网服务提…...
书生大模型实战(从入门到进阶)L3-彩蛋岛-InternLM 1.8B 模型 Android 端侧部署实践
目录 1 环境准备 1.1 安装rust 1.2 安装Android Studio 1.3 设置环境变量 2 转换模型 2.1 安装mlc-llm 2.2 (可选)转换参数 2.3 (可选)生成配置 2.4 (可选)上传到huggingface 2.5 (可选) 测试转换的模型 3 打包运行 3.1 修改配置文件 3.2 运行打包命令 3.3 创建签…...
setState是同步更新还是异步更新
setState是同步更新还是异步更新 先说结论setState为什么设计为异步react18之前为什么不确定是同步还是异步呢react18之后setState有哪些改动 先说结论 React18之前:使用了ReactDOM.render,setState在React调度流程中是异步更新,在原生事件和…...
TCP 流量控制 - 滑动窗口和拥塞控制算法解析
滑动窗口主要管理数据流动的速率,对单个连接较好,拥塞控制则防止网络出现过载,对提高整体的网络通畅较好。下面详细解析两者的原理和作用。 1. TCP 滑动窗口算法 TCP 使用滑动窗口机制来控制数据的发送和接收,以实现流量控制&…...
MongoDB聚合操作及索引底层原理
目录 链接:https://note.youdao.com/ynoteshare/index.html?id=50fdb657a9b06950fa255a82555b44a6&type=note&_time=1727951783296 本节课的内容: 聚合操作: 聚合管道操作: 编辑 $match 进行文档筛选 编辑 将筛选和投影结合使用: 编辑 多条件匹配: …...
C++ | Leetcode C++题解之第454题四数相加II
题目: 题解: class Solution { public:int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {unordered_map<int, int> countAB;for (int u: A) {for (int v: B) {count…...
【从零开始实现stm32无刷电机FOC】【实践】【7.2/7 完整代码编写】
目录 stm32cubemx配置芯片选择工程配置stm32基础配置SPI的配置定时器的配置ADC的配置中断优先级的配置生成工程 工程代码编写FOC代码结构搭建电机编码器角度读取PWM产生FOC开环代码编写确定电机正负旋转方向电机旋转速度计算多圈逻辑角度电流采样极对数转子角度确定 闭环控制控…...
谷歌收录查询工具,谷歌收录查询工具的使用指南
谷歌收录查询工具是网站管理员和SEO专业人士用于检查网站是否被谷歌搜索引擎收录及其收录情况的重要辅助手段。以下是一些常用的谷歌收录查询工具及其详细使用指南: 一、Google Search Console(谷歌搜索控制台) 简介: Google Sea…...
vue3 拖拽插件(drag)
前端vue项目中,经常会有弹框拖拽的需求,下面介绍常用方法: 1.如果你使用的是elementPlus插件的el-dialog组件,只需要增加draggable属性即可,代码如下: <el-dialogv-model"showDiloag"width"500&quo…...
数据结构--线性表(顺序结构)
1.线性表的定义和基本操作 1.1线性表以及基本逻辑 1.1.1线性表 (1)n(>0)个数据元素的有限序列,记作(a1,a2,...an),其中ai是线性表中的数据元素,n是表的长度。 (2)…...
面试准备111
Java基础 反射 集合 多线程 Synchronized/volatile 线程池 cas atomic 网络 tcp 三次握手/四次挥手 流量控制 拥塞控制 数据结构 算法 Spring 循环依赖 Mybatis 如何防止sql注入 Mysql 索引 索引分类 索引设计原则 事务 四种隔离级别 MVCC 日志 Binlog…...
网站建设代码下载大全/北京网络优化
右击项目,单击export》java》选第三个Runnable Jar file (可执行的jar文件),Next,选择launch configuration(程序入口配置),Exportdestination(导出目标)Library handing:选择第一个…...
安徽池州网站制作/关键词排名优化易下拉软件
消息列队的应用场景 https://www.cnblogs.com/yanglang/p/9259172.html...
做静态网站怎样让图片自己切换/百度热搜广告位
让Hadoop跑在云端系列文章,介绍了如何整合虚拟化和Hadoop,让Hadoop集群跑在VPS虚拟主机上,通过云向用户提供存储和计算的服务。 现在硬件越来越便宜,一台非品牌服务器,2颗24核CPU,配48G内存,2T的…...
网站设计公司地址/佛山网站搜索排名
文章目录一、离散傅里叶级数(DFS)-- 周期序列的傅里叶级数1、DFS的定义2、DFS的性质2.1、线性2.2、周期序列的移位2.3、调制特性2.4、对偶性2.5、对称性2.6、周期卷积和一、离散傅里叶级数(DFS)-- 周期序列的傅里叶级数 1、DFS的…...
怎么把淘宝店放到自己做的网站去/个人网站怎么做
说到位图。我们事实上非常早就接触过。从最早接触计算机,我们应该就知道有图片这个东西,然后再进一步说,图片在电脑上有好几种格式比方jpg. gif .png.pcx.bmp等等,当中bmp格式的图片文件事实上就是位图(windows的说法是DIB&#x…...
做网站插入文档特殊字符/经典软文推广案例
因为天冷 我总结完就要钻被窝了 现在手都冻得受不了了 <div id"app"><input type"text" placeholder"请输入新添加成员的名字" v-model"userInput"><input type"submit" value"添加" click"…...