user_W1wPozIR

user_W1wPozIR 查看完整档案

填写现居城市  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 个人简介什么都没有

个人动态

user_W1wPozIR 发布了文章 · 今天 10:57

开发WinForm程序时,如何拥有一个强大的编辑器功能?

点击获取工具>>

DevExpress Winforms v20.2日前全新发布,此版本进一步增强图形图表功能、编辑器性能也得到显著提升,欢迎下载最新版体验!

图表

大数据图表

DevExpress Charts v20.2引入一个新选项-Series.AllowResample,激活此选项可最大程度地减少内存占用量,并以极快的速度为手动创建的系列渲染大量数据集。

DevExpress v20.2新版亮点

Diagram

SVG导出

Diagram控件现在支持矢量(SVG)文件导出。

DevExpress v20.2新版亮点

全新的列表项

Diagram控件包含一个新的容器项 - DiagramList,它将其子项排列在水平或垂直列表中。

DevExpress v20.2新版亮点

度量单位

您可以启用一个新的ShowMeasureUnit选项,来在Properties Panel、Page Setup Window和Bottom Panel中显示度量单位。

其他增强功能

  • v20.2为组织结构图的自动布局包括一个新的DiagramOptionsOrgChartLayout.IsCompact选项, 将此选项设置为false可以计算所有tip-over子树的偏移量,而不是单个层次结构级别的偏移量,这使得具有复杂层次结构的组织图(tip-over子树)更易于阅读和理解。
  • 现在您可以按住鼠标中键并拖动以平移该图,此操作由AllowMiddleButtonDrag选项控制。
编辑器

新的DateTime偏移量编辑

新的WinForms DateTimeOffsetEdit控件使您可以显示和编辑DateTimeOffset值, 编辑器支持屏蔽输入。

掩码

v20.2附带经过全面检查的掩码引擎,从新的选项和设置到高级的掩码编辑器和数据注释支持,掩码引擎包括您需要的一切,以提供无错误数据输入逻辑的直观用户体验。

新的DateTimeOffset掩码

DevExpress v20.2新版亮点

支持数据注释

通过代码优先数据源中的数据注释属性应用掩码。

C#

`using System.ComponentModel.DataAnnotations;

public class Employee {
//allow only literals, first literal is automatically captitalized
RegExEditMask("[A-Z+", IgnoreMaskBlank = true, ShowPlaceholders = false)]
public string FirstName { get; set; }
//DateTime in the short "MM/DD/YYYY" format
[EditMask("d")]
public DateTime HiredAt { get; set; }
}`

具有高级设置的掩码编辑器

掩码编辑器允许您选择预构建的掩码,从头开始创建新掩码或自定义预定义的表达式,保存自定义掩码以及应用高级掩码设置(区域性名称、使用高级插入符号等)。

新的API

在此版本中,可通过RepositoryItemTextEdit.MaskSettings属性使用掩码设置,RepositoryItemTextEdit.Mask选项现在已过时。

C#

`textEdit.Properties.MaskSettings.DataType = typeof(decimal);
textEdit.Properties.MaskSettings.MaskExpression = "###.##";
// or
textEdit.Properties.MaskSettings.MaskManagerType = typeof(SimpleMaskManager);
textEdit.Properties.MaskSettings.MaskExpression = "##-##-##";`

新的'Configure' 方法允许您指定掩码类型、表达式并设置其他设置。 例如,以下代码将数字掩码与以下掩码条件一起应用:

  • 允许用户使用“ 000.00”格式输入十进制数字;
  • 隐藏不影响实际值的零(“ .9”替代“ 0.9”);
  • 即使小数段为0(“ 110.”替代“ 110”),也会显示小数点分隔符。

C#

`using DevExpress.XtraEditors.Mask;

//Fluent API
textEdit5.Properties.MaskSettings.Configure<MaskSettings.Numeric>(settings => {
settings.MaskExpression = "###.##";
settings.AutoHideDecimalSeparator = false;
settings.HideInsignificantZeros = true;
});

//regular API
var settings = textEdit5.Properties.MaskSettings.Configure<MaskSettings.Numeric>();
settings.MaskExpression = "###.##";
settings.AutoHideDecimalSeparator = false;
settings.HideInsignificantZeros = true;`

DevExpress v20.2新版亮点

文本编辑器的“高级模式”(CTP)

新的“高级模式”为所有基于TextEdit的WinForms编辑器添加了许多有趣的选项(TokenEdit、HyperTextLabel和HyperlinkEdit控件除外)。 这些包括:

  • 性能改进
  • 嵌入式标签

DevExpress v20.2新版亮点

  • 表情符号

您的用户现在可以插入包含表情符号的字符串,或按“ Win +”,通过热键从Windows库输入表情符号。

为所需的编辑器启用新的“ AdvancedModeOptions.UseDirectXPaint”选项,以允许插入彩色表情符号。 否则,编辑器将显示标准表情符号的黑白版本。

DevExpress v20.2新版亮点

  • 动画插入符和选择

插入标记的移动和文本选择更令人赏心悦目。

DevExpress v20.2新版亮点

文本选择颜色现在基于当前应用的皮肤。

DevExpress v20.2新版亮点

要激活“高级模式”,请启用“ Properties.UseAdvancedMode”属性。

增强SvgImageBox功能

  • 工具提示
  • 上下文按钮
  • 图像对齐
  • 禁用单个项目
  • 使用自定义外观设置保存SVG

DevExpress v20.2新版亮点

支持Ctrl+Backspace

现在WinForms TextEdit控件及其后代支持Ctrl + Backspace热键组合,该组合将删除光标左侧的单词。

TokenEdit - 绑定到数据

您现在可以将Token Edit绑定到数据,使用新的“ DataSource”属性来指定带有token的描述和唯一值的字段。

DevExpress v20.2新版亮点

C#

`tokenEdit1.Properties.DataSource = categoryBindingSource;
tokenEdit1.Properties.ValueMember = "ID";
tokenEdit1.Properties.DisplayMember = "Name";`

TokenEdit - 单击时显示下拉列表

最终用户现在可以在编辑框中单击来显示带有tokens的下拉列表。

CameraControl,PictureEdit - 指定默认的相机设备和分辨率

此版本向TakePictureDialogShowing事件添加了新参数,以允许您指定默认的相机设备并配置其分辨率。

C#

`void OnTakePictureDialogShowing(object sender, TakePictureDialogShowingEventArgs e) {
e.ResolutionMode = ResolutionMode.Maximum;
}`

Take Picture对话框(独立并嵌入在Picture Edit控件中)将当前相机设备及其分辨率保留在系统注册表中,下次您打开Take Picture对话框时,将重新使用这些设置。

PictureEdit - 配置输出图像格式

新的“ OptionsEditDialog.OutputImageFormat”属性使您可以指定输出图像格式,默认输出图像格式为PNG。

PictureEdit - 图像裁剪操作的自定义宽高比

现在,您可以处理新的'CustomizeCropOptions'事件来自定义宽高比选项。

DevExpress v20.2新版亮点

C#

`void PeEditable_ImageEditorDialogShowing(object sender, ImageEditorDialogShowingEventArgs e) {
e.Form.CustomizeCropOptions += (s, ea) => { CustomizeCropOptions(s, ea); };
}

void CustomizeCropOptions(object sender, CustomizeCropOptionsEventArgs e) {
var widescreen = new AspectRatioInfo(1.777f, "16:9");
var standard = new AspectRatioInfo(1.333f, "4:3");
e.AspectRatios.Clear();
e.AspectRatios.Add(widescreen);
e.AspectRatios.Add(standard);
e.DefaultAspectRatio = widescreen;
}`

ListBox - 项目自动高度

现在当基于模板渲染项目时,WinForms Listbox控件可以自动计算最佳项目高度。

查看原文

赞 0 收藏 0 评论 0

user_W1wPozIR 发布了文章 · 1月18日

浅谈Winform程序的界面布局设计

点击获取工具>>
从事Winform开发很多年了,由于项目的需要,设计过各种各样的界面效果。一般来说,运用传统的界面控件元素,合理设计布局,能够设计出比较中规中矩的标准界面;利用一些换肤的控件或者部分界面组件,能够设计出相对好看一些的界面效果,如以前很盛行的ActiveSkin、IrisSkin和DotNetSkin等,这些能够对传统的界面元素进行换肤,确实比标准灰色的界面控件好看了很多。不过随着界面控件的组件发展,目前一般倾向于是用较为大型的控件组,他们除了提供设计得体的界面控件外,还提供了非常多种绚丽多彩的界面样式供选择,如DotNetBarnetadvantageDevExpress等大型界面控件组。

无论界面设计如何变化,一般基本原则都是为客户提供直观、易用、体验效果较好的界面效果哦,从Office的发展历程我们也可以看到整体的界面效果趋向,从开始的标准控件到目前的Ribbon窗体,从单色调变化到绚丽多彩的界面样式,都给我们提供很好的界面设计参考,大型的界面组件也是模仿这一趋势。言归正传,我们来谈谈详细一点的东西,目前我趋向于采用一种基于Ribbon样式的界面,以及一种基于传统界面结合OutLook样式的界面设计。

一、基于Ribbon样式的界面

WinForm界面开发教程

以上的界面样式,是一种比较大气、符合Office界面效果的界面布局,通过把不同的功能块集中在不同的面板上显示,确实简洁、美观很多,本文不重复介绍该界面效果的优劣,我们主要来集中看看下面的另外一种界面效果。

二、基于OutLook样式的界面设计

其实OutLook样式很早就有,也可以在很多公开的控件组中看到,如果仅仅是追求部分的OutLook界面效果,而不是整体性的方案,那么CodeProject上的这款开源Outlook组件,估计是其中的佼佼者(http://www.codeproject.com/Articles/43181/A-Serious-Outlook-Style-Navigation-Pane-Control)。不过由于需求的是整体性效果,而且还要考虑更多控件界面样式的一致性及美观性,因此我们还是基于DevExpress界面组来设计这样的OutLook界面效果,会显得更加美观大方一点。界面效果如下所示。

WinForm界面开发教程

以上通过把一个系统很多相关的功能模块放到一颗树上进行分类展示,对于一个比较复杂的人力资源管理系统或者其他复杂功能的系统,也是一个比较合理的布局方式,另外OutLook工具条还是可以隐藏起来,节省右边多文档界面的数据展示空间,这样整体还是比较合理及美观的。其中右边的布局,还可以通过SplitContainer方式把它分成多个模块,然后客户想哪个数据显示面板大一点,拖动一下就可以了,这样不至于数据比较多的时候,导致显示布局不好的情况。下面我们来介绍下如何实现以上的界面布局效果。

  1. 创建一个基于DevExpress.XtraEditors.XtraForm基类的窗体。如下代码所示:

`public partial class MainForm : DevExpress.XtraEditors.XtraForm
{
public MainForm()
{
InitializeComponent();
}
}`

  1. 在界面设计中,在DevExpress工具箱Navigation & Layout里面拖动添加一个BarManager控件到窗体中,并删除默认的工具栏Tools,并添加一些菜单项和状态条数据。如下所示。

WinForm界面开发教程

  1. 添加PanelControl和NavBarControl,添加一些测试功能按钮。

由于我们需要使用MDI多文档界面效果,因此先设置Mainform的IsMdiContainer属性为True。

然后添加一个PanelControl,设置其Dock为Top布局,为该控件ContentImage设置一个背景图片(事先用PS设计好,保存为png格式即可),添加几个小Lable,设置其的图片和文字。

最后拖入一个NavBarControl控件到界面中,设置其Dock为Left布局,通过控件的右键菜单上的“Run Designer"进入设计界面,先随便添加一些NavBarGroup和NavBarItem项目,粗略设置得到界面效果如下所示。

WinForm界面开发教程

注意,在NavBarcontrol里面,默认是没有一个Panel可以添加一些特殊的控件,如树、按钮等,默认只有BarItem对象可以添加进入。为了在一个NavBarGroup里面添加这样的控件,需要修改NavBarGroup的属性才行,如下所示。

WinForm界面开发教程

  1. 添加DockManager和XtraTabbedMdiManager 控件实现多文档布局,其最终将以Tab方式进行展现。

继续在上面的窗体中添加DockManager控件和XTraTabbedMdiManager控件,这两个控件可以实现在右边以Tab方式展现多文档布局,这样对用户操作来说,可以一次性打开多个窗体进行操作,方便很多,也必将美观,是一种常见的布局展现。为了在窗体激活的时候,在顶部显示关闭按钮,其他的不显示,那么需要设置XTraTabbedMdiManager控件的ClosePageButtonShowMode=InActiveTabPageHeader即可实现了。最终Tab效果如下所示。

WinForm界面开发教程

以上就是我设计的一个系统界面的具体操作流程,其实很多时候,介绍总是很快,摸索总是很慢,这个就是知识积累的效率提升。当然,要设计好一个系统界面,除了考虑界面的布局美观性、还要考虑图标的协调性、还有就是整体的框架,要可以比较好的适应这些布局控件的操作,不能太过臃肿或者难以阅读。

本文转载自博客园-伍华聪[](https://home.cnblogs.com/u/wu...

查看原文

赞 0 收藏 0 评论 0

user_W1wPozIR 发布了文章 · 1月15日

移动原生应用开发,这款富文本编辑器控件也许用得上

点击获取工具>>

Telerik UI for Xamarin的富文本编辑器控件——构建移动应用原生UI

在2020年Telerik UI for Xamarin发布的最新版本中,引入了两个新的控件:RichTextEditor(beta)ComboBox

Telerik RichTextEditor for Xamarin使用户可以通过“所见即所得”(WYSIWYG)界面来创建丰富的文本内容,该控件具有各种编辑功能,并且在RadRichTextEditorToolbar的帮助下,您可以为用户提供一种轻松快捷的方法来编辑其HTML内容。 默认工具栏包含所有可用的文本格式设置选项,但您也可以根据需要自定义显示的编辑选项。

RichTextEditor有多种用例,作为邮件客户端 - 如果要发送电子邮件并要编辑,请设置文本格式。 作为文本编辑应用程序 - 在将文档导入应用程序来进行编辑、格式化文本或向文档中添加其他信息。

显示HTML内容

您可以轻松显示HTML内容,包括段落、格式化文本、图像、表格、有序和无序列表。

各种HTML来源选项

您可以从字符串以及流中加载HTML源代码。

从字符串加载HTML:

`var htmlSource = @"<h4>RichTextEditor for Xamarin - Overview</h4>
<p>RichTextEditor enables users to create rich textual content through a What-You-See-Is-What-You-Get (WYSIWYG) interface.</p>";
this.richTextEditor.Source = RichTextSource.FromString(htmlSource);`

从流中加载HTML:

`Func<CancellationToken, Task<Stream>> streamFunc = ct => Task.Run(() =>
{
Assembly assembly = typeof(KeyFeatures).Assembly;
string fileName = assembly.GetManifestResourceNames().FirstOrDefault(n => n.Contains("richtexteditor-htmlsource.html"));
Stream stream = assembly.GetManifestResourceStream(fileName);
return stream;
});

this.richTextEditor.Source = RichTextSource.FromStream(streamFunc);`

各种编辑功能
  • 文本格式,例如粗体、斜体、下划线和删除线
  • 字体操作,例如大小、字体、文本颜色和文本背景颜色
  • 项目符号和编号列表
  • 文字选择
  • 超链接操纵 - 创建、编辑和删除超链接
  • 下标和上标格式
  • 缩进和内容对齐
  • 撤消/重做编辑操作
RichTextEditor工具栏

该控件配备了预定义的用户界面,该界面会自动与该控件内置功能提供的所有命令连接在一起。 默认工具栏包含所有可用的文本格式设置选项,但您可以根据需要自定义显示的编辑选项。

`<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<telerikRichTextEditor:RadRichTextEditorToolbar x:Name="richTextToolbar" RichTextEditor="{x:Reference richTextEditor}" />
<telerikRichTextEditor:RadRichTextEditor x:Name="richTextEditor" Grid.Row="1" />
</Grid>`

Telerik UI for Xamarin的富文本编辑器控件——构建移动应用原生UI

只读状态

RichTextEditor的IsReadOnly(bool)属性指示控件是否处于只读模式,设置IsReadOnly =“ True”意味着将禁用工具栏项目,不能更改文档的内容并且不能执行选择。

Telerik UI for Xamarin的富文本编辑器控件——构建移动应用原生UI

命令支持

该控件公开了诸如ToggleBoldCommand、ToggleBulletingCommand、AlignRightCommand等命令,这些命令使您可以对加载到编辑器内容中的内容执行富文本编辑操作。

灵活的样式API

您可以通过各种样式属性(例如BackgroundColor,BorderColor和Thickness,CornerRadius等)来修改RadRichTextEditor的可视化外观以及工具栏项目。

Telerik UI for Xamarin的富文本编辑器控件——构建移动应用原生UI

查看原文

赞 0 收藏 0 评论 0

user_W1wPozIR 发布了文章 · 1月15日

WPF平台开发 - 如何将树编辑器添加到数据网格单元中

点击获取工具>>

问题

试图将树编辑器嵌入具有多选功能的网格单元中,如何将视图模型SelectedPerils绑定到弹出树控件中的已检查项目?

解决方案

据了解,目前的目标是使用带有TreeListView的弹出式编辑器来编辑集合属性,本文将为大家解释此操作所需要的步骤。

  1. GridControl不支持编辑使用FieldName绑定的集合属性,您可以更改属性声明,以便它使用对象类型或使用Binding而不是FieldName。请参阅Binding Columns to Data Source Fields,让我们使用第一个选项:

C#

`public object SelectedPerils { get; set; }
//...
SelectedPerils = new List<Peril>();
//...
((List<Peril>)Portfolios[0].SelectedPerils).Add(Portfolios[0].Perils[0]);
((List<Peril>)Portfolios[1].SelectedPerils).Add(Portfolios[1].Perils[1]);
((List<Peril>)Portfolios[2].SelectedPerils).Add(Portfolios[2].Perils[0]);`

XAML

<dxg:GridColumn FieldName="SelectedPerils" />

  1. 我们建议使用LookUpEdit在弹出窗口中显示GridControl,使用MultiSelectLookUpEditStyleSettings为其启用多选功能,这是执行此操作的预定义方法。由于您希望将其默认TableView替换为TreeListView,因此需要声明CellTemplate和PopupContentTemplate:

XAML

`<dxg:GridColumn FieldName="SelectedPerils">
<dxg:GridColumn.CellTemplate>
<DataTemplate>
<dxg:LookUpEdit
DisplayMember="Name"
ItemsSource="{Binding RowData.Row.Perils}"
Name="PART_Editor">
<dxg:LookUpEdit.PopupContentTemplate>
<ControlTemplate>
<dxg:GridControl Name="PART_GridControl" SelectionMode="MultipleRow">
<dxg:GridControl.View>
<dxg:TreeListView KeyFieldName="ID" ParentFieldName="ParentID" />
</dxg:GridControl.View>
</dxg:GridControl>
</ControlTemplate>
</dxg:LookUpEdit.PopupContentTemplate>
<dxg:LookUpEdit.StyleSettings>
<dxg:MultiSelectLookUpEditStyleSettings />
</dxg:LookUpEdit.StyleSettings>
</dxg:LookUpEdit>
</DataTemplate>
</dxg:GridColumn.CellTemplate>
</dxg:GridColumn>`

  1. 您的编辑器应该能够选择嵌套值,因此您需要使用自参考数据结构,这就是为什么在模板中使用KeyFieldName和ParentFieldName属性的原因。 否则,您的LookUpEdit将拒绝其ItemsSource之外的值,因为在那里使用DisplayMember 并打开了查找模式。

C#

`public class Peril {
public int ID { get; set; }
public int ParentID { get; set; } = -1;
//...
}
//...
Perils = new List<Peril>
{
new Peril { Name = "Earthquake", ID = 0},
new Peril { Name = "EQ", ID = 10, ParentID = 0 },
new Peril { Name = "FF", ID = 11, ParentID = 0 },
new Peril { Name = "Hurricane", ID = 1},
new Peril { Name = "HU", ID = 12, ParentID = 1 },
new Peril { Name = "TC", ID = 13, ParentID = 1 },
new Peril { Name = "Tornado Hail", ID = 2},
new Peril { Name = "TH", ID = 14, ParentID = 2 },
new Peril { Name = "WS", ID = 15, ParentID = 2 },
};`

  1. 没有使用CheckBoxFieldName属性,但是将SelectionMode设置为MultipleRow,TreeListView的复选框不会影响其选择。 必须使用自定义实现对其进行同步(例如,请参阅带有TreeView - Get选中项的LookupEdit),TreeListView的选择将自动发布到SelectedPerils属性。

这是演示结果如以下截图所示:

DevExpress WPF使用教程

查看原文

赞 0 收藏 0 评论 0

user_W1wPozIR 发布了文章 · 1月14日

移动应用如何制作得更精美,这款工具的新功能真的可以了解一下

点击获取工具>>
DevExpress拥有.NET开发需要的所有平台控件,包含600多个UI控件、报表平台、DevExpress Dashboard eXpressApp 框架、适用于 Visual Studio的CodeRush等一系列辅助工具。

DevExpress Xamarin.Forms Controls v20.2发布了全新的CollectionView组件、附带新的图表类型、增强布局功能等,助力打造与时俱进的移动应用,欢迎下载最新版体验!

全新的Collection视图

全新的Xamarin.Forms CollectionView组件显示数据项目集合,其功能包括:

  • 支持垂直和水平布局
  • 支持项目拖放(重新排序项目)
  • 数据排序、过滤和分组
  • 项目模板(数据项目/组标题)
  • 拉动刷新
  • 加载更多
  • 单项和多项选择
  • Dark和Light主题

DevExpress v20.2新版亮点

图表

新的样条系列

此版本在Xamarin.Forms和本机移动图表库中引入了一种新的样条线图表类型。

DevExpress v20.2新版亮点

点和段着色器

v20.2向Xamarin Forms和机移动图表库中引入了点和段着色器,这项新功能可让您根据数据为系列点和线/面线段定义颜色,您可以使用预定义的着色器(例如,每种颜色或值范围)或根据需要实现自定义算法。

DevExpress v20.2新版亮点

轴标签格式增强

Xamarin Chart View现在可以自动设置日期时间和数字轴标签的格式,此功能使您可以在图表轴内显示扩展信息。

DevExpress v20.2新版亮点

数据表单

布局增强

DevExpress v20.2新版亮点

数据网格

虚拟水平滚动

新的AllowVirtualHorizontalScrolling属性极大地提高了Xamarin.Forms DataGridView的性能(当使用大量列时),如果启用此选项,则当用户水平滚动网格时,DataGridView仅呈现在屏幕上显示的列并更新其UI元素。

DevExpress单元编辑器

在以前的版本中,DevExpress Xamarin.Forms数据网格使用标准编辑器来显示和编辑单元格值。 在v20.2中,Xamarin DataGrid改为使用以下DevExpress编辑器:

v20.2还包括三种新的列类型:

  • ComboBoxColumn
  • AutoCompleteColum
  • TimeColumn

自动筛选行

Xamarin.Forms DataGrid视图附带一个新的Auto-Filter Row选项,使用它可以将搜索功能整合到您的移动应用程序中。当用户在Auto-Filter Row列中输入关键字时,数据网格仅显示与指定关键字匹配的那些记录。

您可以根据与列关联的数据类型来控制所使用的搜索运算符(LIKE,CONTAINS,EQUALS等)。

要显示自动过滤器行,请启用ShowAutoFilterRow选项。

DevExpress v20.2新版亮点

保存/还原布局

现在,您可以将DataGrid布局保存到流中,并根据需要将其还原,新的Save / Restore API包含以下方法:

  • SaveLayoutToStream - 将布局保存为XML格式的指定流。
  • RestoreLayoutFromStream - 从指定的流还原布局。
    • *

上DevExpress中文网,获取第一手最新产品资讯!

DevExpress技术交流群3:700924826      欢迎一起进群讨论

查看原文

赞 0 收藏 0 评论 0

user_W1wPozIR 发布了文章 · 1月13日

实用!WinForm界面开发时,功能区表单美化操作指南

点击获取工具>>
RibbonForm类代表一个功能区表单 - 一种嵌入ribbon control 并支持皮肤的表单。

DevExpress WinForms帮助文档

RibbonForm类从XtraForm类派生而来,并共享其大多数功能,例如发光或阴影效果。与XtraForm不同,ribbon form的边框和标题栏始终为皮肤。

  • 将Ribbon Forms添加到项目
  • 将标准表单转化为Ribbon Forms
  • 复合表单标题
  • 增加边框宽度
  • 嵌入Ribbon快速访问工具栏
  • 嵌入状态栏
  • 与BackstageView控件的交互
  • Ribbon显示模式选择器
  • 支持Aero
将Ribbon Forms添加到项目

使用RibbonForm作为主要表单启动项目的最快方法是利用UI-ready DevExpress templates,实现基于Ribbon UI的所有模板都使用Ribbon Forms。

DevExpress WinForms帮助文档

要添加新的Ribbon Forms,请在Visual Studio的Solution Explorer窗口中右键单击您的项目,然后选择"Add DevExpress Item | New Item...",这将调用带有新项目模板的模板库,选择 "Ribbon Form",输入表单名称然后点击"Add Item"。

DevExpress WinForms帮助文档

将标准表单转化为Ribbon Forms

要将现有的默认表单替换为RibbonForms,请调用表单智能标签,然后选择"Convert to Ribbon Form" 选项。如果此操作还不包含RibbonControlRibbonStatusBar 控件,则还将添加到您的窗体。

DevExpress WinForms帮助文档

要在代码中执行相同的操作,只需将表单从System.Windows.Forms.Form派生的基类更改为DevExpress.XtraBars.Ribbon.RibbonForm,您还需要将DevExpress.XtraBars库添加到您的项目。

C#

`using DevExpress.XtraBars;

namespace DXApplication1 {
public partial class Form1 : RibbonForm {
public Form1() {
InitializeComponent();
}
}
}`

VB.NET

`Imports DevExpress.XtraBars

Namespace DXApplication1
Partial Public Class Form1
Inherits RibbonForm

Public Sub New()
InitializeComponent()
End Sub
End Class
End Namespace`

复合表单标题

默认情况下,Ribbon Form的标题是分配给RibbonForm.Text属性的文本字符串。 RibbonControl 提供了两个字符串属性来覆盖此默认标题:RibbonControl.ApplicationCaptionRibbonControl.ApplicationDocumentCaption,第一个属性存储常量形式的标题,而第二个属性可以在代码中进行修改以显示当前所选MDI文档的标题。

DevExpress WinForms帮助文档

可以在RibbonAppearances.FormCaptionRibbonAppearances.FormCaptionForeColor2属性的帮助下自定义两个标题字符串。 要使用它们,请将DefaultBarAndDockingController添加到您的表单中,然后通过BarAndDockingController.AppearancesRibbon 属性访问所需的属性。

C#

`defaultBarAndDockingController1.Controller.AppearancesRibbon.FormCaption.ForeColor = Color.LightGray;
defaultBarAndDockingController1.Controller.AppearancesRibbon.FormCaptionForeColor2 = Color.Lime;`

VB.NET

`defaultBarAndDockingController1.Controller.AppearancesRibbon.FormCaption.ForeColor = Color.LightGray
defaultBarAndDockingController1.Controller.AppearancesRibbon.FormCaptionForeColor2 = Color.Lime`

增加边框宽度

启用WindowsFormsSettings.FormThickBorderWindowsFormsSettings.MdiFormThickBorder属性以扩大Ribbon Form边框并扩大调整大小区域。 请注意,这些设置会影响应用程序中的所有XtraForms和RibbonForms。

DevExpress WinForms帮助文档

如果关闭了阴影发光效果,并且默认的窗体调整大小区域太小,则边框变大会使用户更容易调整窗体的大小。

嵌入Ribbon快速访问工具栏

如果您选择Quick Access Toolbar位于其父Ribbon上方,则该工具栏将显示在Ribbon Form的标题栏中。

DevExpress WinForms帮助文档

嵌入状态栏

除了RibbonControl,Ribbon Form与RibbonStatusBar控件完美地集成在一起。 状态栏还可以显示尺寸夹点元素,最终用户可以拖动该元素在两个方向上调整功能区表单的大小。

DevExpress WinForms帮助文档

与BackstageView控件的交互

BackstageView Control 代表任何Ribbon的主应用程序菜单,这些Ribbon的RibbonControl.RibbonStyle未设置为“ Office2007”。 后台菜单具有自己的样式,可以使用BackstageViewControl.Style属性对其进行更改。

在Office 2010样式中,后台菜单使窗体的标题栏和功能区页眉可见。

DevExpress WinForms帮助文档

在Office 2013样式中,BackstageView控件占据了整个窗体。 根据BackstageViewControl.BackstageViewShowRibbonItems属性的值,这种样式的Backstage菜单可以在其表面上显示Ribbon Form标题、按钮和Ribbon页面标题项目。

DevExpress WinForms帮助文档

Ribbon显示模式选择器

当Ribbon Control为"Office 2013"样式时,Ribbon Form在标准的Minimize、Maximize和Close按钮旁边显示一个附加按钮。 单击后,此按钮会弹出一个菜单,其中包含Ribbon Control可用显示模式。使用此菜单,用户可以将Ribbon切换到全屏模式或最小化Ribbon页面,只保留起标签页标题可见。

DevExpress WinForms帮助文档

若要隐藏此按钮,请禁用RibbonControl.ShowDisplayOptionsMenuButton属性。

支持Aero

针对Windows Vista and 7,Ribbon Forms提供对Aero Glass效果的内置支持。 如果您的应用程序在这些操作系统之一上运行,并且在系统设置中启用了Aero效果,则表单标题栏和边框将是半透明的,如下所示。

DevExpress WinForms帮助文档

若要即使操作系统打开Aero界面也要禁用此效果,请将RibbonForm.AllowFormGlass属性设置为DefaultBoolean.False。 在这种情况下,将根据当前选定的皮肤绘制表单边框和标题栏。

查看原文

赞 0 收藏 0 评论 0

user_W1wPozIR 发布了文章 · 1月12日

将Web仪表盘添加到Angular CLI应用,一键GET

点击获取工具>>
此方法基于客户端 - 服务器模型,您需要一个服务器(一个ASP.NET Core或ASP.NET MVC后端)和一个客户端(前端)应用程序,其中包括所有必需的样式、脚本和HTML模板。请注意,客户端上的脚本版本应与服务器上的库版本匹配,直至次要版本。

本文介绍如何将DxDashboardControlModule模块导入Angular应用程序并显示Web Dashboard。

先决条件
  • 确保在计算机上安装了Node.js和npm
  • 在命令提示符中,全局安装Angular CLI (命令行界面工具):

cmd

npm install -g @angular/cli

使用本教程需要熟悉Angular的基本概念和模式,学习基础:angular.io

要求
  • 客户端上的脚本版本应与服务器上的库版本匹配,直至次要版本。
  • devexpress npm软件包的版本应该相同(其主要版本和次要版本应该相同)。
创建Angular应用程序

在命令提示符下,创建一个Angular应用程序:

cmd

ng new dashboard-angular-app

创建项目后,导航到创建的文件夹:

cmd

cd dashboard-angular-app

安装仪表板软件包

devexpress-dashboard npm软件包将devextreme和@ devexpress / analytics-core引用为peerDependencies ,peerDependencies软件包应手动安装。 这使开发人员可以控制peerDependencies软件包的版本,并保证该软件包安装一次,devexpress-dashboard-angular软件包包含DashboardControl组件和模块。

安装具有必需的peerDependencies的仪表板软件包:

cmd

npm install devexpress-dashboard@20.2-next devexpress-dashboard-angular@20.2-next @devexpress/analytics-core@20.2-next devextreme@20.2-next devextreme-angular@20.2-next --save

安装完成后,您可以在node_modules文件夹中找到所有库。

导入仪表板模块

在app.module.ts文件中,导入DxDashboardControlModule模块。

typescript

`// ...
import { DxDashboardControlModule } from 'devexpress-dashboard-angular';

@NgModule({
imports: [
// ...
DxDashboardControlModule
],
// ...
})
export class AppModule { }`

添加仪表板组件

打开app.component.html文件,并添加<dx-dashboard-control>元素来呈现仪表板组件:

html

`<dx-dashboard-control

endpoint="https://demos.devexpress.com/services/dashboard/api"

</dx-dashboard-control>`

DashboardControlOptions.endpoint属性指定用于将数据请求发送到服务器的URL,该值应由承载Web仪表板服务器端的基本URL和路由前缀组成 - 路由前缀 - 在MVC / .NET Core MapDashboardRoute属性中设置的值。

添加全局样式

在styles.css文件中添加以下全局样式:

css

`@import url("../node_modules/jquery-ui/themes/base/all.css");
@import url("../node_modules/devextreme/dist/css/dx.common.css");
@import url("../node_modules/devextreme/dist/css/dx.light.css");
@import url("../node_modules/@devexpress/analytics-core/dist/css/dx-analytics.common.css");
@import url("../node_modules/@devexpress/analytics-core/dist/css/dx-analytics.light.css");
@import url("../node_modules/@devexpress/analytics-core/dist/css/dx-querybuilder.css");
@import url("../node_modules/devexpress-dashboard/dist/css/dx-dashboard.light.css");
`

运行应用程序

运行应用程序。

cmd

npm start

在浏览器中打开http://localhost:4200/来查看结果,Web仪表板显示存储在预配置服务器(https://demos.devexpress.com/...)上的仪表板。 请按照以下说明配置服务器:

查看原文

赞 0 收藏 0 评论 0

user_W1wPozIR 发布了文章 · 1月12日

WinForm界面开发时,如何美化你的任务对话框?

点击获取工具>>

Telerik UI for WinForms的R3 2020版本中,套件中添加了新的RadTaskDialog组件。 任务对话框是一个小窗口,它向用户显示信息并提示他们进行响应。 与常规消息框相比,任务对话框具有许多配置选项,可以显示其他UI元素(如单选按钮和进度条),并支持事件处理。

Telerik UI for WinForms教程

概述

RadTaskDialog是Windows对话框和新发布的.NET 5的TaskDialog可替代选择,该对话框是一个窗口,允许用户执行命令、向用户提问、为用户提供信息或指示进度、正在进行的任务。RadTaskDialog代表标准System.Windows.Forms.MessageBox和RadMessageBox的扩展版本,与常规消息框相比,它可以显示其他控件,例如进度条,并支持事件处理。

功能
  • Auto-Size:窗口的大小基于添加到页面的内容。
  • 分页:提供到新页面的导航(通过从当前属性重建对话框),任务对话框可以充当带有多个页面的小型向导,Microsoft建议使用不超过三页。
  • 支持的元素:任务对话框支持各种预定义的元素(如平面按钮、常规按钮、进度条、等待条、单选按钮、复选框、扩展器按钮、扩展器区域、页脚),这些元素可以分配并自动排列 无需编写任何布局逻辑。
  • 图标:除了表示错误、警告、信息的标准图标外,任务对话框在整个标题/标题背景上还具有绿色、黄色、红色、灰色或蓝色的条形。 此外,开箱即用也支持自定义图标和图像。
  • 模态与非模态:可以通过ShowDialog或Show方法来模态或非模态显示。
  • 本地化:每个预定义字符串的本地化。
  • 主题:超过25个预定义主题。
  • 自定义:RadTaskDialog可以根据您需要满足的特定要求进行构造,并允许添加或删除任何元素以及自定义任何预定义元素。

它有一个包含所有必要用户信息的主要元素 - RadTaskDialogPage,RadTaskDialogPage公开了一些有用的属性,这些属性使您可以仅用几行代码来设置整个对话框:

  • Caption:显示此页面时,RadTaskDialogForm标题栏中的文本。
  • Icon:带有矢量图像,并可以显示绿色、红色、黄色、蓝色或灰色的栏作为标题背景。
  • Heading: 页面的header/title。
  • Text:显示有关对话框目的的描述性信息。
  • ProgressBar:用于指示确定或不确定的进度。
  • RadioButtons:单选按钮集合,允许用户从不同选项中进行选择。
  • ContentAreaButtons:显示在对话框顶部的平面按钮的集合,这些按钮是扁平的,具有三个主要元素:图标、标题和描述文本。
  • Expander:定义详细信息/描述文本,可以通过切换按钮将其折叠。
  • Verification:复选框可用于接收用户的确认。
  • CommandAreaButtons:显示在页面底部的常规按钮的集合。
  • Footnote: 提供可选的其他说明和帮助,通常针对经验不足的用户。
用法

在描述了对话框的主要功能之后,就该展示一些用例了。 但是在此之前,我们需要澄清两件重要的事情:

  • RadTaskDialog需要RadTaskDialogPage作为要显示的参数。
  • RadTaskDialog不返回System.Windows.Forms.DailogResult(例如MessageBox),而是返回用户单击的按钮的实例。

这是PDF文件移动期间的示例案例,用户必须决定是替换原始文件,取消还是保留两个文件。

Telerik UI for WinForms教程

这是代码,大多数行用于配置命令链接按钮:

`RadTaskDialogPage page = new RadTaskDialogPage()
{
SizeToContent = true,
Icon = RadTaskDialogIcon.ShieldBlueBar,
Caption = "Move File",
Heading = "There is already a file with the same name in this location.",
Text = "Click the file you want to keep",
CommandAreaButtons = {
RadTaskDialogButton.Cancel
},
AllowCancel = true,
UseWideContentArea = true
};

RadSvgImage pdfIcon = RadSvgImage.FromFile(@"....Resourcesfile-pdf.svg");
pdfIcon.Size = new Size(50, 50);
RadTaskDialogCommandLinkButton moveButton = new RadTaskDialogCommandLinkButton(
"Move and Replace",
@"Replace the file in the destination folder with the file you are moving:" + Environment.NewLine +
"document.pdf" + Environment.NewLine + "Size: 275 KB" + Environment.NewLine + "Date Modified: 11.11.2018 12:45");
moveButton.SvgImage = pdfIcon;
page.ContentAreaButtons.Add(moveButton);

RadTaskDialogCommandLinkButton dontMoveButton = new RadTaskDialogCommandLinkButton(
"Don't move",
@"Replace the file in the destination folder with the file you are moving:" + Environment.NewLine +
"document.pdf" + Environment.NewLine + "Size: 275 KB" + Environment.NewLine + "Date Modified: 11.11.2018 12:45");
dontMoveButton.SvgImage = (RadSvgImage)pdfIcon.Clone();
page.ContentAreaButtons.Add(dontMoveButton);

RadTaskDialogCommandLinkButton keepBothButton = new RadTaskDialogCommandLinkButton(
"Move, but keep both files",
"The file you are moving will be renamed 'document(2).pdf'");
page.ContentAreaButtons.Add(keepBothButton);

RadTaskDialogButton clickedButton = RadTaskDialog.ShowDialog(page);
if (clickedButton == null || clickedButton == RadTaskDialogButton.Cancel)
{
// the user cancelled the action
}
else if (clickedButton == moveButton)
{
// move and replace
}
else if (clickedButton == dontMoveButton)
{
// do not move
}
else if (clickedButton == keepBothButton)
{
// move and keep both files
}`

另一个有趣的情况是您需要创建一个多页对话框。 要切换页面,您只需要调用当前显示的RadTaskDialogPage的Navigate方法。

这是打印机安装示例:

Telerik UI for WinForms教程

`RadTaskDialogButton initialButtonYes = RadTaskDialogButton.Continue;
initialButtonYes.Enabled = false;
initialButtonYes.AllowCloseDialog = false;

RadTaskDialogPage initialPage = new RadTaskDialogPage()
{
Caption = "Hardware Installation",
Heading = "Installation Warning",
Text = "The software you are installing for this hardware:nPrintersnhas not passed Windows Logo testing to verify its compatibility with Windows",
Icon = RadTaskDialogIcon.ShieldWarningYellowBar,
AllowCancel = true,

Verification = new RadTaskDialogVerificationCheckBox()
{
Text = "Install anyway"
},

CommandAreaButtons =
{
initialButtonYes,
RadTaskDialogButton.Cancel
},
DefaultButton = RadTaskDialogButton.Cancel
};

RadTaskDialogPage inProgressPage = new RadTaskDialogPage()
{
Caption = "Hardware Installation",
Heading = "Installation in progress...",
Text = "Please wait while the installation is in progress.",
Icon = RadTaskDialogIcon.Information,

ProgressBar = new RadTaskDialogProgressBar()
{
State = RadTaskDialogProgressBarState.Marquee
},

Expander = new RadTaskDialogExpander()
{
Text = "Initializing...",
Position = RadTaskDialogExpanderPosition.AfterFootnote
},

CommandAreaButtons =
{
RadTaskDialogButton.Cancel
}
};

RadTaskDialogPage finishedPage = new RadTaskDialogPage()
{
Caption = "Hardware Installation",
Heading = "Success!",
Text = "The Printer installation completed successfully.",
Icon = RadTaskDialogIcon.ShieldSuccessGreenBar,
CommandAreaButtons =
{
new RadTaskDialogButton("Finish")
}
};

RadTaskDialogVerificationCheckBox checkBox = initialPage.Verification;
checkBox.CheckedChanged += (sender, e) =>
{
initialButtonYes.Enabled = checkBox.Checked;
};

initialButtonYes.Click += (sender, e) =>
{
initialPage.Navigate(inProgressPage);
};

inProgressPage.Created += delegate (object s, EventArgs e)
{
RadTaskDialogProgressBar progressBar = inProgressPage.ProgressBar;
Timer timer = new Timer();
timer.Interval = 2800;
int progressValue = 0;
timer.Start();
timer.Tick += delegate (object sender, EventArgs args)
{
timer.Interval = 40;
if (progressBar.State == RadTaskDialogProgressBarState.Marquee)
{
progressBar.State = RadTaskDialogProgressBarState.Normal;
}

progressBar.Value = progressValue;
inProgressPage.Expander.Text = string.Format("Installation Progress: {0} %", progressValue);
if (progressValue == 100)
{
timer.Stop();
timer.Dispose();
inProgressPage.Navigate(finishedPage);
}

progressValue++;
};
};`

最后,技术团队还组件了三组不同的矢量图标:渐变、平面和白色:

Telerik UI for WinForms教程

我们添加了三种不同的方法,这些方法根据内部需求返回不同的格式和大小。 要访问这些图像,可以使用以下代码:

`// Returns a vector image
RadSvgImage svgIcon = RadTaskDialogIcon.GetSvgImage(RadTaskDialogIconImage.FlatShieldQuestion);

// Returns a raster image with size 16x16px
Image smallIcon = RadTaskDialogIcon.GetSmallImage(RadTaskDialogIconImage.FlatShieldQuestion);

// Returns a raster image with size 26x26px
Image largeIcon = RadTaskDialogIcon.GetLargeImage(RadTaskDialogIconImage.FlatShieldQuestion);`

查看原文

赞 0 收藏 0 评论 0

user_W1wPozIR 发布了文章 · 1月11日

如何在DevExpress程序中使用条形码/二维码控件?

点击获取工具>>
在很多业务系统里面,越来越多涉及到条形码、二维码的应用了,不管在Web界面还是WInform界面都需要处理很多物料相关的操作,甚至很多企业为了减少录入错误操作,为每个设备进行条形码、二维码的标签,直接在流程中进行扫描处理,仅仅在界面勾选一些处理选项即可,极大提高工作效率,降低出错的几率。本文介绍如何在基于WInform的DevExpress程序中对条形码、二维码的处理,包括界面展示,报表打印等常规的处理。

一、DevExpress的条形码操作及报表打印

在15.1以上的DevEpxress版本中,增加了BarCodeControl控件,该控件包含了条形码、二维码等的展示和处理,支持很多种编码。

在工具箱里面,我们可以找到这个控件,添加到界面后,设置属性就可以显示如下的效果。

WinForm界面开发教程WinForm界面开发教程

对于条形码的控件显示,需要设置对应的编码,以及显示内容等信息。

设置正确的格式显示,才能显示出条形码的内容,否则会处理得不到显示的内容。

WinForm界面开发教程

为了方便界面的处理,动态增加对应的条形码控件展示,我们独立出一个条形码控件,如下所示。

WinForm界面开发教程

为了方便展示,我们在界面上添加一个FlowLayoutPanel流布局控件,用来动态添加条码内容的容器,界面代码如下所示。

WinForm界面开发教程

运行Demo程序,可以得到下面的测试界面效果。

WinForm界面开发教程

对于条形码的打印操作,我们可以基于XtraReport的报表模板对内容进行展示的,因此需要设计一个报表的界面,如下所示是设计好的报表界面。

WinForm界面开发教程

这个报表界面就是添加一个空白报表,然后加入对应的标签和二维码报表控件,和操作WInform界面一样,排版后就可以了。

然后增加对应的数据源信息,以及设定绑定控件的字段名称即可。

WinForm界面开发教程

最后绑定报表数据源,并打印报表的界面代码如下所示。

WinForm界面开发教程

得到界面效果如下所示。

WinForm界面开发教程

二、二维码控件的处理

上面介绍的是条形码操作,其中BarCodeControl很有迷惑性,其实它也可以作为二维码的空间处理的,这是后来才发现,哈哈。

其实Github上也有很多开源的二维码控件,可以生成图片进行展示的。

如下界面所示,我们可以看到,这个二维码也是即看即所得的效果,设置界面后,马上可以看到效果的。

WinForm界面开发教程

使用内置控件,我们在后台代码赋值的时候,只需要设置它的内容即可,如下所示。

`//使用内置控件
var url = this.txtContent.Text.Trim();
this.barCodeControl1.Text = url;`

如果使用第三方二维码控件,如ThoughtWorks.QRCode(https://github.com/aaronogan/...),则创建的代码如下所示。

WinForm界面开发教程

最后得到两组界面的对比,如下所示。

WinForm界面开发教程

本文转载自博客园-伍华聪[](https://home.cnblogs.com/u/wu...

查看原文

赞 0 收藏 0 评论 0

user_W1wPozIR 发布了文章 · 1月8日

Delphi开发所需VCL组件支持甘特图了!轻松实现项目管理

点击获取工具>>
DevExpress VCL v20.2发布一个功能强大的项目管理工具——甘特图控件、为标准VCL打开/保存文件对话框引入可换肤的DevExpress副本等,欢迎下载v20.2版本体验!

全新的甘特图控件(Beta)

新的DevExpress VCL甘特控件是功能强大的项目管理工具,允许用户安排实现项目目标所需的活动并监视其进度。

DevExpress v20.2新版亮点

DevExpress v20.2新版亮点

甘特图控件具有以下功能:

  • 项目管理的三个视图:甘特图、资源表和时间表
  • 多种任务、依赖项和约束类型
  • 手动和自动任务计划
  • 工作日和假期跟踪
  • 自定义时间刻度
  • 滚动和缩放选项
  • 撤消/重做历史
  • 项目XML文件支持
  • DirectX硬件加速
打开/保存文件对话框(CTP)

此版本为标准VCL打开/保存文件对话框引入了可换肤的DevExpress副本,从标准VCL打开文件对话框继承了对话框,使替换标准对话框就像更改类名一样容易。

DevExpress v20.2新版亮点

DevExpress v20.2新版亮点

DevExpress v20.2新版亮点

DevExpress v20.2新版亮点

增强UX

平滑滚动

此版本为以下DevExpress VCL组件添加了平滑滚动支持:

  • Grid Control
  • TreeList Control
  • Vertical Grid Control
  • Layout Control
  • NavBar Control
  • PDF Viewer
  • Flow Chart Control
  • Org Chart Control
  • Image Slider Control
  • Scroll Box Control
  • Image Editor
  • Print Preview

使用外观(或外观)控制器中新引入的选项或控件的外观设置来激活所需的滚动模式,源代码中的dxScrollAnimationTime全局常量允许您调整滚动动画的平滑度。

内容填充选项

在此版本中,VCL Grid、TreeList、Pivot Grid和Vertical Grid控件引入了一种快速的方法来填充其就地编辑器和/或标题,并调整某些UI元素之间的间距,使用新的TdxVisualRefinements.Padding和TdxVisualRefinements.HeaderPadding类属性来指定元素每一侧的填充。

Delphi

TdxVisualRefinements.Padding := TRect.Create(3, 5, 3, 5);
TdxVisualRefinements.HeaderPadding := TRect.Create(2, 2, 2, 2);

筛选条件的新显示样式

现在,VCL Grid、TreeList和Vertical Grid控件中可用的过滤器支持下图中显示的新可视化样式,这种样式可帮助最终用户轻松区分彩色滤镜项目,修改或清除各个滤镜条件。

DevExpress v20.2新版亮点

内置的Filter Builder对话框和独立的Filter Controls中也提供了新样式。

DevExpress v20.2新版亮点

网格控件

表视图和带状表视图中的自定义行布局(CTP)

自定义行布局允许用户以类似于Layout View提供的方式来排列单元,并在设计和运行时提供许多自定义选项。

DevExpress v20.2新版亮点

性能增强

  • 内容的渲染速度提高了两倍
  • Banded Table Views中的布局计算速度最高可提高三倍
  • OnGetFilterValues事件处理程序几乎立即用项目填充过滤器下拉列表
  • 查找列值的排序速度提高了30%
查看原文

赞 0 收藏 0 评论 0

认证与成就

  • 获得 2 次点赞
  • 获得 1 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 1 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2020-09-16
个人主页被 1.2k 人浏览