Wpf学习片段
IRegionManager
和IContainerExtension
IRegionManager
是 Prism 框架中用于管理 UI 区域(Regions)的核心接口,它实现了模块化应用中视图(Views)的动态加载、导航和生命周期管理。
IContainerExtension
是依赖注入(DI)容器的抽象接口,而Resolve<T>()
方法用于从容器中解析指定类型的实例
public class u1: UserControl
{IRegionManager _regionManager;IContainerExtension _container;public u1(IContainerExtension container, IRegionManager regionManager){_regionManager = regionManager;_container = container;//从容器中解析ListView类型的实例。如果ListView已注册为单例,则返回单例实例;否则返回新实例ListView ListView11 =_container.Resolve<ListView>();//获取中心显示区域IRegion region= _regionManager.Regions["ContentRegion"];//为中心显示区域添加视图(ListView11),并为视图分配一个名称“ListView1”region.Add(ListView11 , "ListView1");//将指定视图(ListView11)设置为区域(region)中的活动视图region.Activate(ListView11);}}
u1的xaml中有:
<ContentControl Grid.Column="1" prism:RegionManager.RegionName="ContentRegion" />
......
<dx:DXTabItem Header="名称">
<local:ListView/>//将ListView
视图嵌入到DXTabItem
中,作为选项卡页的内容。</dx:DXTabItem>
其中ListView是自定义的另一个用户控件。
在 Prism 框架中,结合第三方控件库(如 DevExpress 的 DXTabItem
)时,可以通过 XAML 直接定义视图(如 ListView
)并将其嵌入到选项卡控件中。
region.Activate(view)
方法用于将指定视图(view
)设置为区域(IRegion
)中的活动视图。
单选框的动态绑定
<StackPanel Margin="20">
<TextBlock Text="组合单选框" FontWeight="Bold"/>
<DockPanel x:Name="GroupRadioButton">
<StackPanel DockPanel.Dock="Left">
<ItemsControl ItemsSource="{Binding RadioButtons}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<RadioButton Content="{Binding SecurityId}"
IsChecked="{Binding IsSelected, Mode=TwoWay}"
GroupName="RadioButtons"
Command="{Binding DataContext.RadioCheckCommand,
RelativeSource={RelativeSource AncestorType=Window}}"
CommandParameter="{Binding}">
</RadioButton>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel><StackPanel DockPanel.Dock="Right"
Orientation="Horizontal"
HorizontalAlignment="Center"
VerticalAlignment="Center">
<TextBlock Text="{Binding SelectedRadioButton.SecurityId, StringFormat='结果:{0}'}" />
</StackPanel>
</DockPanel>
</StackPanel>
using Prism.Commands;
using Prism.Mvvm;
using StrategyClient.Models;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;namespace StrategyClient.ViewModels
{class SellStrategyViewModel : BindableBase{/// <summary>/// 当前选择的单选框/// </summary>private ConfigAccount _selectedRadioButton;/// <summary>/// 当前选择的单选框/// </summary>public ConfigAccount SelectedRadioButton{get => _selectedRadioButton;set => SetProperty(ref _selectedRadioButton, value);}/// <summary>/// 需要显示的一组单选框的信息链表/// </summary>public ObservableCollection<ConfigAccount> RadioButtons { get; } = new ObservableCollection<ConfigAccount>();/// <summary>/// 绑定命令触发(单选框选择改变时)/// </summary>public DelegateCommand<ConfigAccount> RadioCheckCommand { get; }public SellStrategyViewModel(){// 初始化单选框选项RadioButtons.Add(new ConfigAccount { SecurityId = "选项1", IsSelected = false });RadioButtons.Add(new ConfigAccount { SecurityId = "选项2", IsSelected = false });RadioButtons.Add(new ConfigAccount { SecurityId = "选项3", IsSelected = false });// 设置默认选中项if (RadioButtons.Count > 0){RadioButtons[0].IsSelected = true;SelectedRadioButton = RadioButtons[0];}// 注册命令RadioCheckCommand = new DelegateCommand<ConfigAccount>(OnRadioChecked);}private void OnRadioChecked(ConfigAccount item){// 更新选中项foreach (var radioButton in RadioButtons){radioButton.IsSelected = radioButton == item;}SelectedRadioButton = item;}}
}
检查UI绑定路径
xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase"
......
<CheckBox IsChecked="{Binding IsSelectedV, Mode=TwoWay, diagnostics:PresentationTraceSources.TraceLevel=High}"
HorizontalAlignment="Center"
VerticalAlignment="Center"/>
如果直接绑定到
IsSelectedV
属性不起作用,可以尝试使用CellValue
绑定:<CheckBox IsChecked="{Binding RowData.Row.IsSelectedV, Mode=TwoWay}"/>
在这种情况下,
RowData.Row
通常是指当前行的数据对象。
实现弹窗功能:
//App中注册对话框
containerRegistry.RegisterDialog<View, ViewModel>();
// 显示弹窗
void ShowDialog(string name, IDialogParameters parameters, Action<IDialogResult> callback);
// 显示模态弹窗(阻塞式)
void Show(string name, IDialogParameters parameters, Action<IDialogResult> callback);
主视图的ViewModel:
public ObservableCollection<string> Items
{
get;
set;
} = new ObservableCollection<string>();/// <summary>
/// 按钮按下弹窗
/// </summary>
private void Button_Click()
{
//传递参数
var parameters = new DialogParameters
{
{ "DataList", Items }
};//View:视图名,parameters:要传递的参数
_dialogService.ShowDialog("View", parameters, (IDialogResult result) =>
{//弹窗关闭后回调函数
// 从结果中获取数据链表
if (result.Parameters.TryGetValue<ObservableCollection<string>>("DataList", out var dataList))
{
Items = dataList;
}
});}
// 定义弹窗事件
public class ShowDialogEvent : PubSubEvent<DialogParameters> { }// 发布弹窗请求
var parameters = new DialogParameters { { "message", "保存成功!" } };
_eventAggregator.GetEvent<ShowDialogEvent>().Publish(parameters);
// 弹窗服务订阅事件并显示弹窗
_eventAggregator.GetEvent<ShowDialogEvent>()
.Subscribe(ShowDialog, ThreadOption.UIThread);
private void ShowDialog(DialogParameters parameters)
{
_dialogService.ShowDialog("MessageDialog", parameters);
}
View视图的ViewModel
class ViewModel : BindableBase, IDialogAware
{
public ObservableCollection<string> Items
{
get => _items;
set => SetProperty(ref _items, value);
}/// <summary>
/// 对话框事件,传递对话框的结果
/// </summary>
public event Action<IDialogResult> RequestClose;
/// <summary>
/// 关闭对话框时传递参数
/// </summary>
public event Action<IDialogParameters> RequestClosed;// 对话框标题
public string Title => "弹窗标题";/// <summary>
/// 允许关闭对话框
/// </summary>
/// <returns></returns>
public bool CanCloseDialog()
{
return true;
}/// <summary>
/// 关闭对话框时
/// </summary>
public void OnDialogClosed()
{
var resultParameters = new DialogParameters
{
{ "DataList", Items }
};
// 触发请求关闭事件
RequestClosed?.Invoke(resultParameters);
}/// <summary>
/// 打开对话框时
/// </summary>
/// <param name="parameters"></param>
public void OnDialogOpened(IDialogParameters parameters)
{
if (parameters.TryGetValue<ObservableCollection<SellStrategyModel>>("DataList", out var initialName))
{
Items = initialName;
}
}}
单选框:
<DockPanel x:Name="GroupRadioButton">
<ItemsControl ItemsSource="{Binding RadioButtons}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<RadioButton Content="{Binding Id}"
IsChecked="{Binding IsSelected, Mode=TwoWay}"
GroupName="RadioButtons"
Command="{Binding DataContext.RadioCheckCommand,
RelativeSource={RelativeSource AncestorType=Window}}"
CommandParameter="{Binding}">
</RadioButton>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DockPanel>
viewModel
/// <summary>
/// 当前选择的单选框
/// </summary>
private ConfigAccount _selectedRadioButton;
/// <summary>
/// 当前选择的单选框
/// </summary>
public ConfigAccount SelectedRadioButton
{
get => _selectedRadioButton;
set => SetProperty(ref _selectedRadioButton, value);
}/// <summary>
/// 需要显示的一组单选框的信息链表
/// </summary>
public ObservableCollection<ConfigAccount> RadioButtons { get; } = new ObservableCollection<ConfigAccount>();
/// <summary>
/// 绑定命令触发(单选框选择改变时)
/// </summary>
public DelegateCommand<ConfigAccount> RadioCheckCommand { get; }public ViewModel()
{
AddSecurityStrategy();
// 设置默认选中项
if (RadioButtons.Count > 0)
{
RadioButtons[0].IsSelected = true;
SelectedRadioButton = RadioButtons[0];
}
RadioCheckCommand = new DelegateCommand<ConfigAccount>(OnRadioChecked);
}/// <summary>
/// 单选框按钮选择时触发
/// </summary>
/// <param name="item">选择的单选框对象</param>
private void OnRadioChecked(ConfigAccount item)
{
// 更新选中项
//foreach (var radioButton in RadioButtons)
//{
// radioButton.IsSelected = radioButton == item;
//}
SelectedRadioButton = item;
}/// <summary>
/// 添加需要显示的单选框按钮
/// </summary>
private void AddSecurityStrategy()
{
string[] addStrategys = System.Configuration.ConfigurationManager.AppSettings["SellStrategy"].ToString().Split('|');
foreach (string addStrategy in addStrategys)
{
RadioButtons.Add(new ConfigAccount() { IsSelected = false, SecurityId = addStrategy });
}
}
动态加载不同模块的 UI
方法一:
1.注册区域
确保 "MainContent"
区域已通过 IRegionManager
注册(通常在 XAML 中声明或代码中动态添加):
_regionManager.Regions.Add("MainContent", new Region());
或者
<!-- 或在 XAML 中声明区域 --> <ContentControl prism:RegionManager.RegionName="MainContent" />
2.App.xaml.cs
//MainView:要加载的视图的名称,MainView1:起的名字
containerRegistry.RegisterForNavigation<MainWindowView, MainWindowViewModel>("MainView1");
或
//MainView:要加载的视图的名称,没起名字
registry.RegisterForNavigation<MainWindowView, MainWindowViewModel>();
3.点击按钮时实现ViewModel:
//起名字了这里传入起的名字
_regionManager.RequestNavigate("MainContent", "MainView1");
//没起名字,这里传入类名
_regionManager.RequestNavigate("MainContent", "MainWindowView");
//传递参数:
var parameters = new NavigationParameters();
parameters.Add("orderId", 123);
_regionManager.RequestNavigate("MainRegion", "OrderDetailView", parameters);
方法二:
1.注册区域
确保 "MainContent"
区域已通过 IRegionManager
注册(通常在 XAML 中声明或代码中动态添加):
_regionManager.Regions.Add("MainContent", new Region());
或者
<!-- 或在 XAML 中声明区域 --> <ContentControl prism:RegionManager.RegionName="MainContent" />
2.在模块初始化时注册视图到指定区域:
void MainWindow_Loaded(object sender, RoutedEventArgs e)
{//开始的时候MainContent会显示loading视图
_regionManager.RegisterViewWithRegion("MainContent", typeof(loading));
}
3.点击按钮时实现ViewModel:
_regionManager.RequestNavigate("MainContent", "loading");
获取UI界面实例的view Model,调用对应的函数
方法一:
// 获取目标区域
IRegion contentRegion = _regionManager.Regions["MainContent"];
// 获取当前激活的视图
object activeView = contentRegion.ActiveViews.FirstOrDefault();
// 获取视图的 DataContext(即 ViewModel)
var viewModel = activeView.GetType().GetProperty("DataContext")?.GetValue(activeView) as DownLoadViewModel;
//调用视图方法改变UI内文字
viewModel?.testc();
方法二:
//注册为单例
registry.RegisterSingleton<DownLoadViewModel>();
// 直接解析 ViewModel 实例
var viewMode2 = _container.Resolve<DownLoadViewModel>();
viewMode2?.testc();
注册服务
方法 | 用途 | 生命周期控制 |
---|---|---|
RegisterForNavigation<TView>() | 注册视图到导航系统,自动绑定 ViewModel(通过命名约定) | 默认瞬态(每次导航创建新实例) |
RegisterSingleton<T>() | 注册类型为单例,全局唯一实例 | 单例 |
RegisterForNavigation<TView, TViewModel>() | 显式指定视图和 ViewModel 的绑定关系 | 可自定义(结合其他注册方法) |
Register<TInterface, TImplementation>() | 注册接口到具体实现 | 默认瞬态 |
RegisterInstance<T>(T instance) | 注册已创建的实例为单例 | 单例 |
//举例
registry.RegisterForNavigation<DownLoadView, DownLoadViewModel>("DownLoad1");
registry.RegisterForNavigation<MainWindowView, MainWindowViewModel>();
registry.RegisterSingleton<DownLoadViewModel>();
registry.RegisterForNavigation<DownLoadView>("downLoad");
registry.RegisterForNavigation<loading>();
containerRegistry.Register<IDownLoadService, DownLoadService>();
var downloadService = new DownLoadService(); containerRegistry.RegisterInstance<IDownLoadService>(downloadService);
管理区域和视图:
方法 | 用途 | 特点 |
---|---|---|
RegisterViewWithRegion | 静态注册视图到区域,自动加载 | 适用于固定视图,初始化时自动加载 |
RequestNavigate | 动态导航到视图,支持参数和回调 | 适用于按需加载的视图,支持导航逻辑 |
IRegion.Add / IRegion.Remove | 手动添加或移除视图 | 适用于精细控制视图的显示/隐藏 |
IRegion.Activate / IRegion.Deactivate | 激活或停用视图 | 适用于切换视图的可见性 |
IRegion.NavigationService | 通过导航服务实现复杂导航逻辑 | 适用于需要自定义导航流程的场景 |
//举例
protected override void OnInitialized(IContainerProvider containerProvider)
{
var regionManager = containerProvider.Resolve<IRegionManager>();
// 将 OrderListView 注册到 MainRegion,视图会在区域初始化时自动加载 regionManager.RegisterViewWithRegion("MainRegion", typeof(OrderListView));
}
_regionManager.RequestNavigate("MainContent", "loading");
var region = _regionManager.Regions["MainRegion"];var view = _container.Resolve<OrderListView>();
region.Add(view); region.Activate(view); // 激活视图
var region = _regionManager.Regions["MainRegion"];var view = region.Views.FirstOrDefault(v => v is OrderListView); if (view != null)
{ region.Remove(view); }
var region = _regionManager.Regions["MainRegion"];var view = region.Views.FirstOrDefault(v => v is OrderListView); if (view != null)
{
region.Activate(view); // 激活视图
// region.Deactivate(view); // 停用视图
}
INavigationAware:
INavigationAware
是 Prism 框架中用于处理导航生命周期事件的核心接口。它允许 ViewModel 在导航过程中响应以下三个关键事件:
- 导航到当前视图时(
OnNavigatedTo
) - 从当前视图导航离开时(
OnNavigatedFrom
) - 导航确认阶段(
IsNavigationTarget
,用于决定是否复用现有 ViewModel 实例)
通过实现 INavigationAware
,可以精细控制 ViewModel 在导航过程中的行为,例如初始化数据、清理资源或决定是否复用实例。
INavigationAware
是 Prism 中管理导航生命周期的核心接口。- 通过实现
IsNavigationTarget
、OnNavigatedTo
和OnNavigatedFrom
,可以精细控制 ViewModel 在导航过程中的行为。 - 适用于需要初始化数据、清理资源或决定是否复用实例的场景。
- 合理使用导航参数(
NavigationParameters
)可以传递上下文数据。
区域上下文
是一种用于在区域(IRegion
)和其宿主控件(如 ContentControl
、ItemsControl
等)之间传递上下文数据的机制。它允许开发者在区域中共享数据,而无需直接依赖视图或视图模型,从而提升代码的解耦性和灵活性。
// 获取区域并设置上下文 var region = _regionManager.Regions["MainRegion"]; region.Context = new AppContext { UserId = "123", Role = "Admin" };//AppContext:自定义Mode
相关文章:
Wpf学习片段
IRegionManager 和IContainerExtension IRegionManager 是 Prism 框架中用于管理 UI 区域(Regions)的核心接口,它实现了模块化应用中视图(Views)的动态加载、导航和生命周期管理。 IContainerExtension 是依赖注入&…...
智能手表测试用例文档
智能手表测试用例文档 产品名称:智能手表 A1 版本号:FW v1.0.0 测试负责人:[填写] 编写时间:2025-xx-xx 文档状态:初次版本 📁 测试用例结构说明 字段描述用例编号测试用例唯一编号,如 TC-FUN…...
密码学--希尔密码
一、实验目的 1、通过实现简单的古典密码算法,理解密码学的相关概念 2、理解明文、密文、加密密钥、解密密钥、加密算法、解密算法、流密码与分组密码等。 二、实验内容 1、题目内容描述 ①定义分组字符长度 ②随机生成加密密钥,并验证密钥的可行性 …...
配置Hadoop集群-集群配置
以下是 Hadoop 集群的核心配置步骤,基于之前的免密登录和文件同步基础,完成 Hadoop 分布式环境的搭建: 1. 集群规划 假设集群包含 3 个节点: master:NameNode、ResourceManagerslave1:DataNode、NodeMana…...
第三方软件测评中心分享:软件功能测试类型和测试工具
在数字化时代,软件测试已成为确保产品质量的重要环节。功能测试作为软件测试中的核心部分,关注于软件产品是否按预期功能正常运作。 软件功能测试可以按不同的方式进行分类,主要包括以下几种类型: 1.正功能测试:验…...
Profibus DP主站与Modbus RTU/TCP网关与海仕达变频器轻松实现数据交互
Profibus DP主站与Modbus RTU/TCP网关与海仕达变频器轻松实现数据交互 Profibus DP主站转Modbus RTU/TCP(XD-MDPBm20)网关在Profibus总线侧实现主站功能,在Modbus串口侧实现从站功能。可将ProfibusDP协议的设备(如:海…...
多视角系统,视角之间的切换,输入操作。无人机Pawn视角的实现
一.创建自己的PlayerController。它相当于是灵魂,穿梭在不同Pawn之间。也即是切换视角。不同输入的响应也写在这里。这样即使,都有鼠标操作,也能区分。避免了代码的重复耦合。也可以叫做视角系统。 class LZJGAMEMODE_API ALZJPlayerControl…...
[学习]RTKLib详解:ionex.c、options.c与preceph.c
RTKLib详解:ionex.c、options.c与preceph.c 本文是 RTKLlib详解 系列文章的一篇,目前该系列文章还在持续总结写作中,以发表的如下,有兴趣的可以翻阅。 [学习] RTKlib详解:功能、工具与源码结构解析 [学习]RTKLib详解&…...
【Linux笔记】——进程信号的保存
🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:Linux 🌹往期回顾🌹:【Linux笔记】——进程信号的产生 🔖流水不争,争的是滔滔不 一、信号的相关概念二、信…...
教育机构教务管理系统哪个好?
在当今教育培训行业快速发展的背景下,一个高效、专业的教务管理系统已成为教育机构提升运营效率、优化教学质量的关键工具。本文将深入分析爱耕云教务管理系统的核心优势,通过具体功能解析和代码示例展示其技术实现方式,并对比市场上其他主流…...
ZYNQ笔记(二十):Clocking Wizard 动态配置
版本:Vivado2020.2(Vitis) 任务:ZYNQ PS端 通过 AXI4Lite 接口配置 Clocking Wizard IP核输出时钟频率 目录 一、介绍 二、寄存器定义 三、配置 四、PS端代码 一、介绍 Xilinx 的 Clock Wizard IP核 用于在 FPGA 中生成和管理…...
电商平台一站式网络安全架构设计指南
摘要:据 Gartner 统计,采用一体化安全方案的电商企业数据泄露成本降低 67%。本文从攻击链分析到防御体系构建,详解如何实现网络层、应用层、数据层的协同防护。 一、电商安全威胁全景图(2024 攻击态势) 1.1 攻击者完…...
烟花爆竹储存需要注意哪些问题
烟花爆竹储存需要注意哪些问题 烟花爆竹作为易燃易爆物品,其储存安全至关重要。不当的储存方式不仅可能导致产品失效,更可能引发火灾、爆炸等严重事故。以下是烟花爆竹储存需要注意的几个关键问题: 一、储存场所选择 必须选择专用仓库储存…...
C++11详解
文章目录 前言一、列表初始化1.1 {} 初始化1.2 initializer_list 类型 三、声明3.1 auto3.2 decltype 四、右值引用和移动语义4.1 左值引用和右值引用4.2 移动语义 五、可变参数模板六、lambda表达式各部分详细解释示例代码代码解释 七、包装器八、bind注意事项 前言 C11在系统…...
VLM-RL:用于安全自动驾驶的统一视觉语言模型和强化学习框架——论文阅读
《VLM-RL: A Unified Vision Language Models and Reinforcement Learning Framework for Safe Autonomous Driving》2024年12月发表,来自Wisconsin Madison分校和Purdue大学的论文。 近年来,基于强化学习(RL)的学习驾驶策略的方法…...
新手安装java所有工具(jdk、idea,Maven,数据库)
新手安装JAVA工具 介绍JDK11IDEA 2025.1Maven数据库(Navicat Premium Lite) 介绍 涉及安装JAVA所需的各种工具 JDK(以JDK11为例)IDEA(以2025.1为例)Maven(以3.8.8为例)数据库&…...
hive在配置文件中添加了hive.metastore.uris之后进入hive输入命令报错
在hive-site.xml文件中加入配置hive.metastore.uris启动hive后报错 <property><name>hive.metastore.uris</name><value>thrift://node154:9083</value></property> 加完属性就需要手动启动metastore服务,因为不使用 Zookeepe…...
Hive原理
Hive 是构建在 Hadoop 上的数据仓库工具,其核心原理是通过类 SQL 语言(HiveQL)将结构化数据查询转换为分布式计算任务(如 MapReduce、Tez、Spark),并利用 HDFS 存储数据。以下是 Hive 的核心原理和架构: 1. 核心设计思想 数据仓库抽象:将 HDFS 上的文件抽象为…...
cursor 出现 unauthorized request
文档出自:https://www.kdocs.cn/l/csE3iuSauHoS...
uniapp|商品列表加入购物车实现抛物线动画效果、上下左右抛入、多端兼容(H5、APP、微信小程序)
以uniapp框架为基础,详细解析商品列表加入购物车抛物线动画的实现方案。通过动态获取商品点击位置与购物车坐标,结合CSS过渡动画模拟抛物线轨迹,实现从商品图到购物车图标的动态效果。 目录 核心实现原理坐标动态计算抛物线轨迹模拟动画元素控制代码实现详解模板层设计脚本…...
点下4个Winform UI开源控件库
从零学习构建一个完整的系统 今天一起来盘点下4个Winform UI开源控件库,有.Net Framework,也有.Net Core。 1、支持.Net 7的开源UI组件框架 项目简介 这是一个基于.Net Framework、.Net 6开发的,WinForm开源UI框架,框架包含常…...
【AI】mcp server本质就是一个接口服务么
以下为元宝的回答: 你的理解非常准确!MCP Server本质上是一个接口服务,但其设计目标、交互逻辑和使用场景与传统后端接口存在显著差异。以下是两者的对比分析: 1. 核心定位差异 维度MCP Server…...
chalrs正常使用一段时间后开启代理访问网页 显示“不是私密链接”解决办法
chalrs正常使用一段时间后开启代理访问网页 显示“不是私密链接”解决办法 背景: charles用了好长时间了,最近发现打开charles有些软件无法上网,浏览器访问网页提示“您的连接不是私密链接”,按照网上的教程重装了几次证书&#x…...
如何通过DNS解析实现负载均衡?
在当今的互联网时代,随着网络应用的飞速发展,网站和各类在线服务面临着海量的用户请求。为了保障服务的高可用性和高性能,负载均衡技术应运而生。DNS(域名系统)负载均衡作为其中一种重要的实现方式,凭借其简…...
uni-app微信小程序登录流程详解
文章目录 uni-app微信小程序登录流程实战详解微信小程序登录流程概述1. 获取登录凭证(code)2. 发送登录请求3. 保存登录态4. 登录状态管理5. 应用登录状态请求拦截器中添加 token自动登录页面路由守卫 使用 Vuex 集中管理登录状态登录组件示例登录流程最…...
基于LVS和Keepalived实现高可用负载均衡架构
目录 一、资源清单 二、修改主机名 三、配置调度器 四、配置Web节点服务器(web1、web2) 五、测试负载均衡 六、测试LVSKeepalived高可用群集 一、资源清单 主机 操作系统 IP地址 lb01 OpenEuler24.03 192.168.16.142 lb02 OpenEuler24.03 …...
微信小程序仿淘宝拍照/照片点位识图、点位裁剪生图、图片裁剪组件、图片点位框选、裁剪生成图片,canvasToImg
实现效果 效果: 1.微信小程序仿淘宝拍照/照片点位识图、根据点位裁剪生图、图片可裁剪、图片高度可控 2.识别点位自动生成标准构图方案,支持手动微调实现像素级精准裁剪 3.可以根据接口识别的点位信息实现拍照/相册图片特征点自动识别并裁剪 实现步骤 …...
EnumUtils:你的枚举“变形金刚“——让枚举操作不再手工作业
各位枚举操控师们好!今天要介绍的是Apache Commons Lang3中的EnumUtils工具类。这个工具就像枚举界的"瑞士军刀",能让你的枚举操作从石器时代直接跃迁到星际文明! 一、为什么需要EnumUtils? 手动操作枚举就像…...
在Taro中开发一个跨端Svg组件,同时支持小程序、H5、React Native
Taro系列中一直没有跨端的绘图工具,小程序端支持canvas但是不支持svg,RN端有 react-native-svg 支持svg,但是没有很好原生的canvas插件,社区的canvas都是基于WebView实现的,或者skia,这个插件的书写方式和c…...
大型视频学习平台项目问题解决笔记
一 数据库大量读操作导致数据库压力过大的解决方案 1. 优化SQL语句 2. 缓存 二 数据库大量写操作导致数据库压力过大的解决方案 1. 优化SQL语句 2. 改同步写为异步写——解决复杂事务的高并发写 3. 合并写请求——解决简单事务的高并发写(额外实现一个异步操作来…...
day18-数据结构引言
一、 概述 数据结构:相互之间存在一种或多种特定关系的数据元素的集合。 1.1 特定关系: 1. 逻辑结构 2.物理结构(在内存当中的存储关系) 逻辑结构物理结构集合,所有数据在同一个集合中,关系平等顺…...
Android音频解码中的时钟同步问题:原理、挑战与解决方案
一、为什么音频同步如此重要? 在多媒体播放系统中,音频同步问题直接影响用户体验。根据行业研究数据: • 15ms以上的同步偏差:53%的用户能感知到音画不同步 • 超过100ms的偏差:会导致明显的"口型对不上"现…...
深入浅出 iOS 对象模型:isa 指针 与 Swift Metadata
在 iOS 开发中,我们经常听到两个看似神秘的词:isa 指针 和 Metadata。这两个概念分别源自 Objective-C 和 Swift 的对象系统,是我们理解底层运行机制、优化性能乃至调试疑难问题的关键。今天我们就来聊一聊,它们到底是什么&#x…...
ARMV8 RK3399 u-boot TPL启动流程分析 --crt0.S
上一篇介绍到start.S 最后一个指令是跳转到_main, 接下来分析 __main 都做了什么 arch/arm/lib/crt0.S __main 注释写的很详细,主要分为5步 1. 准备board_init_f的运行环境 2. 跳转到board_init_f 3. 设置broad_init_f 申请的stack 和 GD 4. 完整u-boot 执行re…...
Lynx-字节跳动跨平台框架多端兼容Android, iOS, Web 原生渲染
介绍 字节跳动近期开源的跨平台框架Lynx被视为一项重要的技术创新。相较于市场上已有的解决方案如React Native (RN) 和Flutter,Lynx具有独特的特性。 首先,Lynx采用轻量级JavaScript逻辑设计,DOM节点构建完全置于Native层,确保U…...
手机换地方ip地址会变化吗?深入解析
在移动互联网时代,我们经常带着手机穿梭于不同地点,无论是出差旅行还是日常通勤。许多用户都好奇:当手机更换使用地点时,IP地址会随之改变吗?本文将深入解析手机IP地址的变化机制,帮助您全面了解这一常见但…...
Linux——数据库备份与恢复
一,Mysql数据库备份概述 1,数据库备份的重要性 数据灾难恢复:数据库可能会因为各种原因出现故障,如硬件故障、软件错误、误操作、病毒攻击、自然灾害等。这些情况都可能导致数据丢失或损坏。如果有定期的备份,就可以…...
矩阵键盘模块
目录 1.矩阵键盘介绍 2.扫描的概念 数码管扫描(输出扫描) 矩阵键盘扫描(输入扫描) 矩阵按键采用逐行扫描: 3.矩阵键盘代码 第一步: 第二步: 第三步: 第四步࿱…...
连接词化归律详解
1. 连接词化归律的基本概念 连接词化归律(也称为归结原理)是数理逻辑中用于简化逻辑表达式的重要方法,它允许我们将复杂的逻辑表达式转化为更简单的等价形式,特别是转化为合取范式(CNF)或析取范式(DNF)。 核心思想 连接词化归律基于一系列逻辑等价关系…...
Ubuntu 18.04 iso文件下载
参考:https://blog.csdn.net/Li060703/article/details/106075597 Rufus 官网: https://rufus.ie/zh/ 镜像下载地址 阿里云镜像站:https://mirrors.aliyun.com/ubuntu-releases/18.04/ 网易镜像:http://mirrors.163.com/ub…...
【C#】ToArray的使用
在 C# 中,ToArray 方法通常用于将实现了 IEnumerable<T> 接口的集合(如 List<T>)转换为数组。这个方法是 LINQ 提供的一个扩展方法,位于 System.Linq 命名空间中。因此,在使用 ToArray 方法之前࿰…...
学习日志03 java
最近有点懈怠了,多多实践,多敲代码,多多专注! 1 ArithmeticException ArithmeticException 是 Java 中的一个异常类,它继承自 RuntimeException,用于表示在算术运算中出现的错误。这个异常通常在以下情况…...
数据库故障排查指南
对于项目研发来讲,数据库是必不可少的一个重要环节,本文详细总结了项目研发中数据库故障问题排查指南,希望会对大家有所帮助。 数据库连接问题 检查数据库服务是否正常运行,确认网络连接是否畅通,验证数据库配置文件…...
洛谷 P1955 [NOI2015] 程序自动分析
【题目链接】 洛谷 P1955 [NOI2015] 程序自动分析 【题目考点】 1. 并查集 2. 离散化 【解题思路】 多组数据问题,对于每组数据,有多个 x i x j x_ix_j xixj或 x i ≠ x j x_i \neq x_j xixj的约束条件。 所有相等的变量构成一个集合&…...
音视频学习:使用NDK编译FFmpeg动态库
1. 环境 1.1 基础配置 NDK 22b (r22b)FFmpeg 4.4Ubuntu 22.04 1.2 下载ffmpeg 官网提供了 .tar.xz 包,可以直接下载解压: wget https://ffmpeg.org/releases/ffmpeg-4.4.tar.xz tar -xvf ffmpeg-4.4.tar.xz cd ffmpeg-4.41.3 安装基础工具链 sudo …...
OpenHarmony Linux内核本地管理
概述 写这篇文章的初衷,其实也是作者从事多年Android系统开发中,根深蒂固的目录情节导致的,再开发Harmony系统中,总是想模拟Android系统的开发思路。 对于OpenHarmony这个patch机制,其实我很讨厌它,虽然这样…...
2025最新出版 Microsoft Project由入门到精通(六)
目录 三种资源类型的分配方式 成本类资源的分配方式 第一步:切换视图为”任务分配状况“视图 第二步:选中任务→资源→分配资源,打开分配资源窗口选择资源单击”分配“ 资源成本的修改方式 编辑工时类资源的分配方式 工时类资源的…...
Tomcat服务部署
目录 一. Tomcat概述 1.1 什么是Tomcat 1.2 安装Tomcat 1.2.1 CentOS7 安装 1.2.2 ubuntu 安装 1.2.3 使用脚本快速安装 二. 配置文件及核心组件 2.1 配置文件 2.1.1 安装目录下文件介绍 2.1.2 conf子目录 2.2 组件 三. tomcat 处理请求过程 四. 常见配置详解 4.…...
Chrome更新到136以后selenium等自动化浏览器失效
Chrome更新到136以后,已经不再支持对默认浏览器数据文件夹进行自动化调试,从而导致selenium在指定user-data-dir为默认路径“C:\Users\{计算机名}\AppData\Local\Google\Chrome\User Data”会报错,相应地的selenium-wire,undetect…...
数据库原理期末考试速成--最后附带两套题
引言 为什么从3开始呢,毕竟是速成吗,总要放弃一些东西 前两章1.概论 2.关系数据库:这里面都是一些运算符什么的,我感觉都学这个:笛卡尔积之列的都会算 这两章比较重要的我就放在这里了 选择、投影、连接、除、并、交、差,其中选择、投影、并、差、笛卡尔积是5种基本关…...