【WPF】自定义控件:ShellEditControl-同列单元格编辑支持文本框、下拉框和弹窗

需要实现表格同一列,单元格可以使用文本框直接输入编辑、下拉框选择和弹窗,文本框只能输入数字,弹窗中的数据是若干位的二进制值。

本文提供了两种实现单元格编辑状态下,不同编辑控件的方法:
1、DataTrigger控制控件的显示;
2、定义DataTemplateSelector选择器根据数据返回不同模板。

效果如下:
![[gif-ShellEditControl.gif]]

数据

行数据类定义

每行数据需要定义属性:

  • detail:string,描述
  • valueType:enum,值类型
  • setValue:object,设定值,需要定义成可更新属性(mvvm)
  • valueOptions:List<optionModel>,值类型为选项时,此属性有值
  • selectedOptionItem:optionModel,所选的元素,需要定义成可更新属性(mvvm)
  • childValues:ObservableCollection<ChildValueModel>,值类型为对象时,此属性有值
  • EditChildValueCommand:RelayCommand,编辑childValues发生弹窗事件按钮
  • editType:string/enum,修改类型,值为不可修改时单元格不可编辑
    定义方法
  • ParseValueToChildValue:setValue转childValues
public class GirdData : ObservableObject
{public string detail { get; set; }public ValueTypeEnum valueType { get; set; }private object _value;public object setValue{get{return _value;}set{//弹窗数据,二进制 《---》 十进制if (valueType == ValueTypeEnum.Object) childValues = ParseValueToChildValue(value, defaltChildValues);//文本框数据,string <----> 数值//value未填写时默认为“--”if (valueType == ValueTypeEnum.Number && value.ToString() != "--")try { //decimalPlaces小数点位数,类中应当有该属性,这里省略value = Decimal.Round(Decimal.Parse(value.ToString()), decimalPlaces); } catch { }OnPropertyChanged(ref _value, value);}}public List<OptionModel> valueOptions { get; set; }public OptionModel selectedOptionItem{get{if (this.valueType != ValueTypeEnum.Option) return null;//获取setValue对应的选项if (setValue.ToString() == "--") return new OptionModel();return valueOptions.Find(_ => _.optionValue.ToString() == setValue.ToString());}set{if (this.valueType != ValueTypeEnum.Option) return;//获取选中选项的值this.setValue = value.optionValue;}}public ObservableCollection<ChildValueModel> childValues { get; set; }public RelayCommand EditChildValueCommand { get; set; }//十进制转二进制public ObservableCollection<ChildValueModel> ParseValueToChildValue(object oValue, ObservableCollection<ChildValueModel> childValues){return ParseValueToChildValue_static(oValue, childValues);}public static ObservableCollection<ChildValueModel> ParseValueToChildValue_static(object oValue, ObservableCollection<ChildValueModel> childValues){int value = int.Parse(oValue.ToString());string sValues = Convert.ToString(value, 2);if (sValues.Length > childValues.Count) return null;sValues = sValues.PadLeft(childValues.Count, '0');for (int i = 0; i < childValues.Count; i++){childValues[childValues.Count - 1 - i].value = int.Parse(sValues[i].ToString());}return childValues;}
}
public enum ValueTypeEnum
{Number,Option,Object
}
//下拉框选项的类
public class OptionModel
{public int optionValue { get; set; }public string detail { get; set; }public override string ToString(){return fullDetail;}//页面中展示的选项及结果的字符串格式 值[描述]public string fullDetail{get{string res = optionValue + "[" + detail + "]";return detail == null ? "--" : res;}}
}
//弹窗中各位二进制对应类
public class ChildValueModel : ObservableObject, ICloneable
{public Action InvokeCollectionChangedAction;private object _value;public object value{get => _value;set{OnPropertyChanged(ref _value, value);//其中一位发生改变,对应的十进制发生变化,触发该事件InvokeCollectionChangedAction?.Invoke();}}public string propertyName { get; set; }public object Clone(){return new ChildValueModel{value = this.value,propertyName = this.propertyName};}
}

生成表格数据

写一些假数据,格式如下

new ObservableCollection<GirdDataModel>{new GirdData(){detail:**,valueType:ValueTypeEnum.**,setValue:**,//如“--”、1、23.432editType:**,//valueType==ValueTypeEnum.Option//如valueOptions = new List<OptionModel>{new OptionModel{ optionValue=0,detail="正向"},new OptionModel{ optionValue=1,detail="反向"}},//valueType==ValueTypeEnum.Object//如childValues = new ObservableCollection<ChildValueModel>{new ChildValueModel{ propertyName="bit0",value=0},new ChildValueModel{ propertyName="bit1",value=0},new ChildValueModel{ propertyName="bit2",value=0},new ChildValueModel{ propertyName="bit3",value=0},}},...
}

页面

表格页面

View

主要列包括

  • 描述 - detail
  • 设定值 - setValue
    <DataGridTemplateColumn.CellTemplate>自定义单元格未编辑时内容模板
  • 值类型为Option时,绑定selectedOptionItem,会自动调用ToString,显示格式:值[描述];
  • 值类型为其他时,绑定setValue;
    <DataGridTemplateColumn.CellEditingTemplate>自定义单元格编辑时内容模板
    提供两种实现不同值类型,单元格编辑方式不同的方法
1、DataTrigger控制控件的显示
  • 值类型为Number时,显示文本框,绑定setValue;
  • 值类型为Option时,显示下拉框,ItemsSource绑定valueOptions,SelectedItem绑定selectedOptionItem,下拉框元素模板本文绑定fullDetail,格式:值[描述];
  • 值类型为Object时,显示文本+详情按钮,文本绑定setValue,按钮绑定EditChildValueCommand(详细方法定义在VM中),并传值行全部数据。
<DataGrid ItemsSource="{Binding GridData,Mode=TwoWay}" RowBackground="#E4FAF5"AlternatingRowBackground="#C8F0F0"CanUserAddRows="False"AutoGenerateColumns="False"><DataGrid.Columns><DataGridTextColumn Header="描述" Binding="{Binding detail,Mode=OneWay}" IsReadOnly="True"/><DataGridTemplateColumn Header="设定值"><DataGridTemplateColumn.CellTemplate><DataTemplate><Grid><TextBlock><TextBlock.Style><Style TargetType="TextBlock"><Setter Property="Text" Value="{Binding setValue,StringFormat=N0,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/><Style.Triggers><DataTrigger Binding="{Binding valueType}" Value="Option"><Setter Property="Text" Value="{Binding selectedOptionItem}"/></DataTrigger><DataTrigger Binding="{Binding decimalPlaces}" Value="3"><Setter Property="Text" Value="{Binding setValue,StringFormat=N3,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/></DataTrigger></Style.Triggers></Style></TextBlock.Style></TextBlock></Grid></DataTemplate></DataGridTemplateColumn.CellTemplate><DataGridTemplateColumn.CellEditingTemplate><DataTemplate><Grid><Grid.Resources><Style TargetType="TextBox" x:Key="SetValueBox"><Setter Property="Text" Value="{Binding setValue,StringFormat=N0,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/><Setter Property="Visibility" Value="Collapsed"/><Setter Property="Template"><Setter.Value><ControlTemplate><Grid><Rectangle StrokeThickness="1"/><TextBox Margin="1"Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Text,Mode=TwoWay}"BorderThickness="0"Background="Transparent"VerticalAlignment="Center"Foreground="WhiteSmoke"/></Grid></ControlTemplate></Setter.Value></Setter><Style.Triggers><DataTrigger Binding="{Binding valueType}" Value="Number"><Setter Property="Visibility" Value="Visible"/></DataTrigger><DataTrigger Binding="{Binding decimalPlaces}" Value="3"><Setter Property="Text" Value="{Binding setValue,StringFormat=N3,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/></DataTrigger></Style.Triggers></Style></Grid.Resources><TextBox Style="{StaticResource SetValueBox}"/><ComboBox ItemsSource="{Binding valueOptions}"SelectedItem="{Binding selectedOptionItem}"><ComboBox.Style><Style TargetType="ComboBox"><Setter Property="Visibility" Value="Collapsed"/><Style.Triggers><DataTrigger Binding="{Binding valueType}" Value="Option"><Setter Property="Visibility" Value="Visible"/></DataTrigger></Style.Triggers></Style></ComboBox.Style><ComboBox.ItemTemplate><DataTemplate><TextBlock Text="{Binding fullDetail}"/></DataTemplate></ComboBox.ItemTemplate></ComboBox><Grid><Grid.Style><Style TargetType="Grid"><Setter Property="Visibility" Value="Collapsed"/><Style.Triggers><DataTrigger Binding="{Binding valueType}" Value="Object"><Setter Property="Visibility" Value="Visible"/></DataTrigger></Style.Triggers></Style></Grid.Style><TextBlock Text="{Binding setValue,Mode=TwoWay}"/><Button Width="20" Content="..." HorizontalAlignment="Right"Command="{Binding EditChildValueCommand}"CommandParameter="{Binding}"/></Grid></Grid></DataTemplate></DataGridTemplateColumn.CellEditingTemplate></DataGridTemplateColumn></DataGrid.Columns>
</DataGrid>
2、定义DataTemplateSelector选择器

选择器可以根据值类型和修改类型,返回不同单元格编辑模板
选择器逻辑如下:

public class CellEditTemplateSelector : DataTemplateSelector
{public DataTemplate TextBoxTemplate { get; set; }public DataTemplate ComboxTemplate { get; set; }public DataTemplate PopupButtonTemplate { get; set; }public DataTemplate UnEnableTemplate { get; set; }public override System.Windows.DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container) {if (item is GirdDataModel) {GirdDataModel data = item as GirdDataModel;if (data.editType == "不可修改") return UnEnableTemplate;switch (data.valueType){case ValueTypeEnum.Number:return TextBoxTemplate;case ValueTypeEnum.Option:return ComboxTemplate;case ValueTypeEnum.Object:return PopupButtonTemplate;}}return base.SelectTemplate(item, container);}
}

xaml中定义不同的单元格编辑模板,然后将选择器应用值CellEditingTemplateSelector属性。

<UserControl.Resources><local:SetValueTextConverter x:Key="SetValueTextConverter"/><local:SetValueTextEditingConverter x:Key="SetValueTextEditingConverter"/><local:CellEditTemplateSelector x:Key="CellEditTemplateSelector"><local:CellEditTemplateSelector.TextBoxTemplate><DataTemplate><TextBox><TextBox.Text><MultiBinding Converter="{StaticResource SetValueTextEditingConverter}"><Binding Path="setValue" UpdateSourceTrigger="PropertyChanged" /><Binding Path="decimalPlaces"/></MultiBinding></TextBox.Text></TextBox></DataTemplate></local:CellEditTemplateSelector.TextBoxTemplate><local:CellEditTemplateSelector.ComboxTemplate><DataTemplate><ComboBox ItemsSource="{Binding valueOptions}"SelectedItem="{Binding selectedOptionItem}"><ComboBox.ItemTemplate><DataTemplate><TextBlock Text="{Binding fullDetail}"/></DataTemplate></ComboBox.ItemTemplate></ComboBox></DataTemplate></local:CellEditTemplateSelector.ComboxTemplate><local:CellEditTemplateSelector.PopupButtonTemplate><DataTemplate><Grid><TextBlock Text="{Binding setValue,Mode=TwoWay}"/><Button Width="20" Content="..." HorizontalAlignment="Right"Command="{Binding EditChildValueCommand}"CommandParameter="{Binding}"/></Grid></DataTemplate></local:CellEditTemplateSelector.PopupButtonTemplate><local:CellEditTemplateSelector.UnEnableTemplate><DataTemplate><TextBlock Text="--"/></DataTemplate></local:CellEditTemplateSelector.UnEnableTemplate></local:CellEditTemplateSelector>
</UserControl.Resources>
...
<DataGrid ItemsSource="{Binding GridData,Mode=TwoWay}" RowBackground="#E4FAF5"AlternatingRowBackground="#C8F0F0"CanUserAddRows="False"AutoGenerateColumns="False"><DataGrid.Columns><DataGridTextColumn Header="描述" Binding="{Binding detail,Mode=OneWay}" IsReadOnly="True"/><DataGridTemplateColumn Header="设定值" CellEditingTemplateSelector="{StaticResource CellEditTemplateSelector}"><DataGridTemplateColumn.CellTemplate><DataTemplate><Grid><TextBlock><TextBlock.Style><Style TargetType="TextBlock"><Setter Property="Text" Value="{Binding setValue,StringFormat=N0,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/><Style.Triggers><DataTrigger Binding="{Binding valueType}" Value="Option"><Setter Property="Text" Value="{Binding selectedOptionItem}"/></DataTrigger><DataTrigger Binding="{Binding decimalPlaces}" Value="3"><Setter Property="Text" Value="{Binding setValue,StringFormat=N3,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/></DataTrigger></Style.Triggers></Style></TextBlock.Style></TextBlock></Grid></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn></DataGrid.Columns>
</DataGrid>

ViewModel

private DataAccessForGrid dataAccessForGrid;
public ObservableCollection<GirdData> gridData { get; set; }
public ShellEditControl()
{dataAccessForGrid = new DataAccessForGrid();gridData = dataAccessForGrid.GetDataList();foreach (var _ in gridData){if (_.valueType == ValueTypeEnum.Object){//定义弹窗事件_.EditChildValueCommand = new RelayCommand((o) =>{ChildValueEditPopupOpen(_);});}}
}
//使用IOC模式打开弹窗
private void ChildValueEditPopupOpen(GirdData data)
{IChildValueEditPopupService service = IoC.Provide<IChildValueEditPopupService>();ChildValueEditPopupResult res = service.ChildValueEditPopupOpen(data);if (res.IsSuccess){data.setValue = res.setValue;}
}

弹窗页面

View

主要内容:表格(ChildValues)和当前值(SetValue)

<Window x:Class="bueatifulApp.Components.DataGridWithEdit.View.ChildValuePopup"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:bueatifulApp.Components.DataGridWithEdit.View"mc:Ignorable="d"Title="写入参数" Height="313" Width="400"Background="#DADFEA" ><Grid Margin="10"><Grid.RowDefinitions><RowDefinition Height="55"/><RowDefinition/><RowDefinition Height="30"/></Grid.RowDefinitions><Grid ><Grid.ColumnDefinitions><ColumnDefinition Width="100"/><ColumnDefinition/></Grid.ColumnDefinitions><Grid.RowDefinitions><RowDefinition Height="25"/></Grid.RowDefinitions><TextBlock VerticalAlignment="Center" Text="描述" Grid.Column="0" Grid.Row="1"/><TextBox Height="18" Text="{Binding Code}" IsEnabled="False" Grid.Column="1" Grid.Row="1"/></Grid><Grid Grid.Row="1"><DataGrid ItemsSource="{Binding ChildValues,Mode=TwoWay}" CanUserAddRows="False"AutoGenerateColumns="False"><DataGrid.Columns><DataGridTextColumn Header="属性名" Binding="{Binding propertyName,Mode=OneWay}" IsReadOnly="True"/><DataGridTextColumn Header="设定值" Binding="{Binding value,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/></DataGrid.Columns></DataGrid></Grid><Grid Grid.Row="2"><Grid.ColumnDefinitions><ColumnDefinition Width="200"/><ColumnDefinition/></Grid.ColumnDefinitions><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="70"/><ColumnDefinition/></Grid.ColumnDefinitions><TextBlock VerticalAlignment="Center" Text="当前值"/><TextBox Height="18" Text="{Binding SetValue,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Grid.Column="1"/></Grid><Grid Grid.Column="1" HorizontalAlignment="Right"><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDefinitions><Button Command="{Binding OKCommand}" Height="25" Width="60" Content="确定" Margin="0,0,10,0"/><Button Command="{Binding CancelCommand}" Height="25" Width="60" Content="取消" Grid.Column="1"/></Grid></Grid></Grid>
</Window>

ViewModel

public class ChildValueEditViewModel : ObservableObject
{private string code;//描述private ObservableCollection<ChildValueModel> childValues;//表格数据private object setValue;//设定值public string Code{get => this.code;set => OnPropertyChanged(ref code, value);}public ObservableCollection<ChildValueModel> ChildValues{get => this.childValues;set => OnPropertyChanged(ref childValues, value);}public object SetValue{get => this.setValue;set => OnPropertyChanged(ref setValue, value);}
}public class ChildValueEditPopupViewModel : ChildValueEditViewModel
{public ICommand OKCommand { get; }public ICommand CancelCommand { get; }public IView View { get; }public ChildValueEditPopupViewModel(IView view){this.View = view;this.OKCommand = new RelayCommand((o) => this.OkAction());this.CancelCommand = new RelayCommand((o) => this.CancelAction());}public void OkAction(){this.View.CloseDialog(true); // close it with a successful result}public void CancelAction(){this.View.CloseDialog(false); // close it with a failed result}
}

服务

定义窗口打开事件
定义窗口打开时接受的数据

服务接口
public interface IChildValueEditPopupService
{Task<ChildValueEditPopupResult> ChildValueEditPopupOpenAsync(GirdData data);ChildValueEditPopupResult ChildValueEditPopupOpen(GirdData data);
}
public class ChildValueEditPopupResult : ObservableObject
{public bool IsSuccess { get; set; }private object _setValue;public string code { get; set; }public object setValue { get=>_setValue; set=>OnPropertyChanged(ref _setValue,value); }
}
服务实现
internal class ChildValueEditPopupService : IChildValueEditPopupService
{public ChildValueEditPopupResult ChildValueEditPopupOpen(GirdData data){var popup = new ChildValuePopup();popup.ViewModel.Code = data.detail;//需要深拷贝,才能正确修改大表数据popup.ViewModel.ChildValues = Copy.DeepCopy( data.childValues);foreach (var item in popup.ViewModel.ChildValues){//定义大表设定值响应事件item.InvokeCollectionChangedAction = () => {popup.ViewModel.SetValue = GirdDataModel.ParseChildValues_static(popup.ViewModel.ChildValues);};}popup.ViewModel.SetValue = data.setValue;bool result = popup.ShowDialog() == true;if (!result) {return new ChildValueEditPopupResult() { IsSuccess = false};}return new ChildValueEditPopupResult(){IsSuccess = true,code = popup.ViewModel.Code,setValue = popup.ViewModel.SetValue,}; }public async Task<ChildValueEditPopupResult> ChildValueEditPopupOpenAsync(GirdData data) {return await Application.Current.Dispatcher.InvokeAsync(() => {return ChildValueEditPopupOpen(data);});}
}
服务注册
 public partial class MainWindow : Window{public MainWindow(){InitializeComponent();IoC.Register<IChildValueEditPopupService>(new ChildValueEditPopupService());}}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Gson、Fastjson 和 Jackson 对比解析

目录 1. Gson (Google) 基本介绍&#xff1a; 核心功能&#xff1a; 特点&#xff1a; 使用场景&#xff1a; 2. Fastjson (Alibaba) 基本介绍&#xff1a; 核心功能&#xff1a; 特点&#xff1a; 使用场景&#xff1a; 3. Jackson 基本介绍&#xff1a; 核心功能…

浅谈微信视频号推荐算法

这次可能会稍微有点干货&#xff0c;但保证不晦涩~ 一、算法推荐的本质&#xff1a;猜你喜欢 vs 社交绑架​ 视频号的推荐系统本质上在做两件事&#xff1a; ​预测你的兴趣​&#xff1a;通过你的浏览、点赞、评论、分享等行为&#xff0c;分析你的偏好。​满足社交需求​&…

halcon模板匹配(一)create_shape_model_xld

目录 一、提取刹车盘孔洞轮廓二、形状模板的创建-设置-训练-查找三、找到亮的圆孔四、获得匹配结果五、使用use_polarity进行模板匹配六、计算四个圆对应的矩形框七、创建四个圆对应的模板并查找一、提取刹车盘孔洞轮廓 小技巧总结,使用boundary 函数提取区域边界,在边界范围…

day26图像处理OpenCV

文章目录 一、OpenCV1.介绍2.下载3.图像的表示4.图像的基本操作4.1图片读取或创建4.1.1读取4.1.2创建 4.2创建窗口4.3显示图片4.3.1设置读取的图片4.3.2设置显示多久4.3.3释放 4.4.保存图片4.5图片切片&#xff08;剪裁&#xff09;4.6图片大小调节 5.在图像中绘值5.1绘制直线5…

零基础开始学习鸿蒙开发-智能家居APP离线版介绍

目录 1.我的小屋 2.查找设备 3.个人主页 前言 好久不发博文了&#xff0c;最近都忙于面试&#xff0c;忙于找工作&#xff0c;这段时间终于找到工作了。我对鸿蒙开发的激情依然没有减退&#xff0c;前几天做了一个鸿蒙的APP&#xff0c;现在给大家分享一下&#xff01; 具体…

C++的*了又*

先看下面一段代码 class HeapWord {friend class VMStructs;private:char *i; };主函数 #include "HeapWord.hpp" int main() {HeapWord *heapword new HeapWord();HeapWord *p new HeapWord();HeapWord **p1 new HeapWord *();heapword 3;*(HeapWord **)p he…

yolov8在windows系统的C++版本的onnxruntime部署方法

1.各个软件的的环境需要保持在统一的版本。 onnxruntime需要和cuda的版本对应上,版本号:onnxruntime-win-x64-gpu-1.18.1 ,链接: NVIDIA - CUDA | onnxruntime cuda:本机显卡支持的版本,cuda11.7,链接:CUDA Toolkit Archive | NVIDIA Developer cudnn:需要对应到cud…

js chrome 插件,下载微博视频

修改说明&#xff1a; 代码资源&#xff0c;免积分下载 起因&#xff0c; 目的: 最初是想下载微博上的NBA视频&#xff0c;因为在看网页上看视频很不方便&#xff0c;快进一次是10秒&#xff0c;而本地 VLC 播放器&#xff0c;快进一次是5秒。另外我还想做点视频剪辑。 对比…

【vue3】@click函数传动态变量参数

根据java的学习&#xff0c;摸索了一下vue3 函数传参的方式。以此作为记录。有更好的其它方式&#xff0c;可以评论区补充。 <script> const tmpref(); </script><button click"tmpFunction(传递参数:tmp)">按钮</button> // 直接【字符串…

jmeter 集成ZAP进行接口测试中的安全扫描 实现方案

以下是将 JMeter 集成 ZAP(OWASP Zed Attack Proxy)进行接口测试中安全扫描的实现方案: 1. 环境准备 JMeter 安装:从 JMeter 官方网站(https://jmeter.apache.org/download_jmeter.cgi)下载并安装 JMeter,确保其版本稳定。ZAP 安装:从 ZAP 官方网站(https://www.zapr…

全能格式转换器v16.3.0.159绿色便携版

前言 全能格式转换器具有音视频格式转换、合并视频、压缩视频、录制视频、下载视频、DVD刻录等功能。以超快的转换速度及强大的功能在国外名声大噪&#xff0c;转换速度是市面同类产品的30倍&#xff0c;操作简便&#xff0c;支持158种视频格式无损转换&#xff0c;批量转换高…

【基于开源insightface的人脸检测,人脸识别初步测试】

简介 InsightFace是一个基于深度学习的开源人脸识别项目,由蚂蚁金服的深度学习团队开发。该项目提供了人脸检测、人脸特征提取、人脸识别等功能,支持多种操作系统和深度学习框架。本文将详细介绍如何在Ubuntu系统上安装和实战InsightFace项目。 目前github有非常多的人脸识…

设计一个简单的权限管理系统

针对大规模服务器集群的权限管理系统设计&#xff0c;需结合 角色分层、最小权限原则 和 动态权限控制 来实现安全高效的权限管理。以下是分阶段设计方案&#xff1a; 一、核心设计思路 基于角色的访问控制&#xff08;RBAC&#xff09; 定义角色层级&#xff08;如董事长 >…

使用 nano 文本编辑器修改 ~/.bashrc 文件与一些快捷键

目录 使用 nano 编辑器保存并关闭文件使用 sed 命令直接修改文件验证更改 如果你正在使用 nano 文本编辑器来修改 ~/.bashrc 文件&#xff0c;以下是保存并关闭文件的具体步骤&#xff1a; 使用 nano 编辑器保存并关闭文件 打开 ~/.bashrc 文件 在终端中运行以下命令&#xf…

spm12_fMRI 2*4混合方差分析 Flexible factorial 对比矩阵

实验设计&#xff1a;2*4被试内设计 分析模型&#xff1a;spm 二阶分析中的 Flexible factorial 问题&#xff1a;Flexible factorial交互作用对比矩阵如何编写&#xff1f; 老师&#xff1a;deepseek老师【大神们看看这个矩阵是否可以如下编写&#xff1f;】 以下是来自de…

用Python修改字体字形与提取矢量数据:fontTools实战指南

字体设计与分析是NLP和视觉领域的交叉应用&#xff0c;而**fontTools** 是一款强大的Python库&#xff0c;可以让我们直接操作字体文件的底层结构。本文将通过两个实用函数&#xff0c;展示如何修改特定字形和提取所有字形的矢量数据&#xff0c;帮助开发者快速上手字体编辑与分…

Windows 11 PowerShell重定向文本文件的编码问题

目录 问题的由来 编码导致的问题 解决办法 VSCode进行转换 记事本进行转换 直接指定输出的文本编码 总结 问题的由来 在我的嵌入式系统的课程中有一个裸机开发的实验&#xff0c;其中需要把图片等文件转换为C语言数组保存在程序中。课程中&#xff0c;我推荐了CodePlea的…

SQL开发的智能助手:通义灵码在IntelliJ IDEA中的应用

SQL 是一种至关重要的数据库操作语言&#xff0c;尽管其语法与通用编程语言有所不同&#xff0c;但因其在众多应用中的广泛使用&#xff0c;大多数程序员都具备一定的 SQL 编写能力。然而&#xff0c;当面对复杂的 SQL 语句或优化需求时&#xff0c;往往需要专业数据库开发工程…

算法——分支限界

学习目标&#xff1a; 掌握算法入门知识 学习内容&#xff1a; 分支限界的定义例题详细步骤讲解&#xff08;找牛&#xff09; 1. 分支限界的定义 分支限界法是一种用于求解 组合优化问题 的算法框架&#xff0c;通过 系统性地搜索解空间树&#xff0c;并结合 剪枝策略 来避…

对接日本金融市场数据全指南:K线、实时行情与IPO新股

一、日本金融市场特色与数据价值 日本作为全球第三大经济体&#xff0c;其金融市场具有以下显著特点&#xff1a; 成熟稳定&#xff1a;日经225指数包含日本顶级蓝筹股独特交易时段&#xff1a;上午9:00-11:30&#xff0c;下午12:30-15:00&#xff08;JST&#xff09;高流动性…