# ConfigCreate **Repository Path**: flashcom/config-create ## Basic Information - **Project Name**: ConfigCreate - **Description**: 简单方便生成各类复杂配置框并绑定到自己的对象中 - **Primary Language**: C# - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-09-07 - **Last Updated**: 2024-07-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #### 介绍 简单方便生成各类复杂配置框并绑定到自己的对象中。支持代码直接创建或定义一个实体类,并在属性上添加对应特性即可生成。并支持指定控件对指定属性值进行检查来确定可用性或可见性,也支持角角权限。属性值代码检查提示等。 ### 方便生成 #### 简单参数配置框 ```csharp public class SimpleData { public SimpleData(string node_name, string node_content) { this.NodeName = node_name; this.NodeContent = node_content; } [CreateTextBox("", "", "节点名", Necessary = true)] //文本框控件 public string NodeName { get; set; } [CreateTextBox("", "", "节点显示", Necessary = true)] //文本框控件 public string NodeContent { get; set; } } ``` ```csharp //生成简单配置框 SimpleData data = new SimpleData("Node1", "节点1"); ConfigWin win = new ConfigWin(); win.Width = 350; win.Height = 200; win.Title = "修改节点属性"; if (win.AddControlSource(data)) win.ShowDialogWin(); ``` 即可生成 ![简单设置对话框](Images/简单设置对话框.jpg) #### 手动创建对话框 ```csharp //声明配置框 ConfigWin win = new ConfigWin(); //设置配置框标题 win.Title = "我的配置框"; //设置配置框图标 win.Icon = new BitmapImage(new Uri("pack://application:,,,/WpfTest;component/爆米花.png")); //设置参数修改通知 win.SaveParametersChange += Win_SaveParametersChange; //添加文本框 win.AddTextBox("基本设置", "主要参数", mdata, "MyTitle", "文本框", necessary: true); //添加数字框 win.AddNumeric("基本设置", "主要参数", mdata, "MyNumber", "数值框"); //添加切换框-带文字 win.AddToggleButton("基本设置", "第二参数", mdata, "MyBool", "切换按钮1", "选择", "不选"); //添加切换框-默认样式 win.AddToggleButton("基本设置", "第二参数", mdata, "MyBool", "切换按钮2"); //添加密码框 win.AddPasswordBox("基本设置", "第二参数", mdata, "MyPassWord", "密码框"); //设置下拉框 项列表 List tl = new List() { new ComboBoxData("这是第一项", TData.One), new ComboBoxData("第二项啊-第二项", TData.Two), new ComboBoxData("不会是第三项吧", TData.Three), new ComboBoxData("最后的第四项了",TData.Four) }; //添加下拉框 win.AddComboBox("进阶设置", "第一组", mdata, "MyTData", "组合框", typeof(TData), tl); //添加日期框 win.AddDatePicker("进阶设置", "第一组", mdata, "MyDate", "日期选择框"); //添加日期时间框 win.AddDateTimePicker("进阶设置", "第一组", mdata, "MyTime", "日期时间选择框"); //添加多选下拉框 win.AddMultipleComboBox("进阶设置", "第二组", mdata, "MyList", "多选组合框", typeof(TData), tl); //添加IP地址设置框 win.AddIpAddressTextBox("进阶设置", "第二组", mdata, "MyIP", "IP地址框"); //添加文件选择框 - 单选 win.AddOpenFile("进阶设置", "第二组", mdata, "SelectedFile", "单文件选择框", "请选择要载入的文本文件", "文本文件|*.txt|所有文件|*.*"); //添加文件选择框 - 多选 win.AddOpenFile("进阶设置", "第二组", mdata, "Files", "多文件选择框", "请选择要载入的文本文件", "文本文件|*.txt|所有文件|*.*", true); //添加文件保存框 win.AddSaveFile("进阶设置", "第二组", mdata, "SaveFile", "文件保存框", "请选择要保存的文本文件", "文本文件|*.txt|所有文件|*.*", true); //添加目录选择框 win.AddOpenFolder("进阶设置", "第二组", mdata, "MyFolder", "目录选择框", "请选择打开的目录"); //添加标签框 win.AddTextBlock("进阶设置", "第三组", mdata, "MyLabel", horizontal_alignment: HorizontalAlignment.Center, font_weight: "Bold", font_size: 28); //添加自定义控件 win.AddCustomControl("基本设置", "第二参数", mdata, "MyUControlModel"); //设置可见关联 win.SetVisibilityPanel("基本设置", "第二参数", "MyPassWord", "MyBool", true); win.SetVisibilityPanel("进阶设置", "第二组", "MyFolder", "基本设置", "第二参数", "MyBool", true); win.SetVisibilityGroup("基本设置", "主要参数", "基本设置", "第二参数", "MyBool", true); //设置权限(设置权限角色) win.SetRolePermissionPanel("进阶设置", "第一组", "MyTData", "管理员"); win.SetRolePermissionPanel("进阶设置", "第一组", "MyTData", "主管"); win.SetRolePermissionPanel("进阶设置", "第一组", "MyTData", "管理员", RolePermissionType.UnEnabled); win.SetRolePermissionGroup("进阶设置", "第二组", "管理员"); win.SetRolePermissionGroup("进阶设置", "第二组", "主管"); win.SetRolePermissionGroup("进阶设置", "第二组", "管理员", RolePermissionType.UnEnabled); win.SetRolePermissionHeader("基本设置", "管理员"); win.SetRolePermissionHeader("基本设置", "主管"); win.SetRolePermissionHeader("基本设置", "管理员", RolePermissionType.UnEnabled); //设置数值变更通知 win.SetEditNotificationPanel("进阶设置", "第二组", "Files", "我的选择文件"); win.SetEditNotificationPanel("进阶设置", "第二组", "SaveFile", "保存的文件路径"); //设置绑定模式 win.AddOrSetBindingPanel("基本设置", "主要参数", "MyNumber", "节点B.字符串1", (obj, gh) => GetBindingDatas(), false, true, necessary: true); //未设置控件,只设置绑定项,并且为必填项 win.AddOrSetBindingPanel("进阶设置", "第三组", "Txt", "", (obj, gh) => GetBindingDatas(), true, false, "文本", necessary: true); win.DynamicBindingNotification = (dbs) => { dynamic_bindings = dbs; Debug.WriteLine($"获得绑定字典:【{JsonConvert.SerializeObject(dbs)}】"); }; //显示配置框,传入当前登陆角色 if (win.ShowDialogWin(true,"管理员", dynamic_bindings) == true) { } ``` 即可生成 ![手动](Images/手动.gif) #### 由实体类生成配置框 ```csharp public class ConfigData : ICheckParameters, IPreCompletion { [CreateRolePermissionHeader("管理员", PermissionType = RolePermissionType.UnEnabled)] //设置大类别的权限角色,非此角色表现为不可编辑 [CreateDatePicker("进阶设置", "搜索", "起始日期")] //日期选择框控件 public DateTime StartDate { get; set; } = DateTime.Now.AddDays(-1); [CreateDatePicker("进阶设置", "搜索", "结束日期")] //日期选择框控件 public DateTime? EndDate { get; set; } [CreateDateTimePicker("进阶设置", "搜索", "中间时间")] //日期时间控件 public DateTime? SelectTime { get; set; } = DateTime.Now; [CreateVisibilityGroup(VisionType.Three, CheckGroupName = "搜索")] //控制“搜索”组的可见性,当此值包含【VisionType.One和VisionType.Three】中任一个,“搜索”组可见 [CreateVisibilityGroup(VisionType.One, CheckGroupName = "搜索")] [CreateMultipleComboBox("进阶设置", "算法", "使用算法", GroupIndex = 0)] //多选下拉框控件 public List VisionTypes { get; set; } = new List() { VisionType.One }; [CreateOpenFile("进阶设置", "算法", "脚本路径")] //文件选择框控件 public string ScriptPath { get; set; } //文件保存对话框控件 [CreateSaveFile("进阶设置", "算法", "结果位置", IsReadonly = true, DialogTitle = "请选择要保存的文件", DialogFilter = "Docx文档|*.docx|所有文件|*.*")] public string ResultPath { get; set; } [CreateOpenFolder("进阶设置", "算法", "日志目录", Necessary = true)] //目录选择对话框控件 public string LogPath { get; set; } = "E:\\"; [CreateTextBox("基本设置", "数据库", "数据库连接", Necessary = true, HeaderIndex = 0)] //文本框控件,并设置大类别索引为0 public string DBServer { get; } = "127.0.0.1"; //下拉选择框控件 [CreateComboBox("基本设置", "数据库", "数据库类型", Necessary = true, Remark = "可设置数据库的类型, 包括MySQL和SqlServer, 请选择正确的数据库类型")] public DBType DBType { get; set; } [CreateVisibilityPanel("AutoConnect", true, RelevanceGroupName = "服务器")] //受【服务器-AutoConnect】的控件所控制,当AutoConnect的值为true时显示,RelevanceGroupName表示跨组设置 [CreateNumeric("基本设置", "数据库", "超时时间", MaxValue = 60000, MinValue = 100)] //数字框控件 public int DBTimeOut { get; set; } = 1000; [CreateEditNotificationPanel(Definition = "服务器IP地址")] //设置该属性变动会通过SaveParametersChange事件推送(重要参数添加此设置) [CreateIpAddressTextBox("基本设置", "服务器", "服务器地址")] //IP地址控件 public string TCPServer { get; set; } = "192.168.1.102"; [CreateNumeric("基本设置", "服务器", "端口")] //数字框控件 public int Port { get; set; } = 8080; [CreateToggleButton("基本设置", "服务器", "自动连接")] //切换控件,上面的DBTimeOut属性对应的控件因为添加了CreateVisibilityPanel特性,受此属性控件 public bool AutoConnect { get; set; } = true; [CreateIgnoreSaveConfig] //添加此特性后,该属性值不会保存到配置文件中,还原也不会(像密码这类特殊的可以设置该特性,防止把用户输入的密码保存到配置文件中) [CreatePasswordBox("基本设置", "服务器", "验证密码")] //密码框控件 public string Password { get; set; } = "1234"; [CreateBindingPanel("BindingList")] //该生成的控件支持绑定框,并设置绑定列表对象(绑定对象为属性) [CreateTextBox("基本设置", "服务器", "我的文本")] //文本框控件 public string MyTest { get; set; } [CreateRolePermissionGroup("管理员", PermissionType = RolePermissionType.UnEnabled)] //设置角色权限,非【管理员】角色,该组为不可用状态 [CreateTextBox("基本设置", "", "第一项")] //文本框控件 public string Test1 { get; set; } [CreateNumeric("基本设置", "", "第二项", MinValue = 100, MaxValue = 150)] //数字框控件 public int Num2 { get; set; } [CreateNumeric("基本设置", "", "第三项", MinValue = 0, MaxValue = 100, Increment = 0.1d, Places = 2)] //数字框控件 public double Num3 { get; set; } [CreateRolePermissionConrol("管理员")] //设置触角权限,非【管理员 和 主管】,该控件不可见 [CreateRolePermissionConrol("主管")] [CreateIpAddressTextBox("基本设置", "测试权限", "第四项")] //IP地址控件 public string IP4 { get; set; } [CreateTextBlock("进阶设置", "其它", FontSize = 20, HorizontalAlignment = System.Windows.HorizontalAlignment.Right, ForegroundColor = "Red")] public string MyLabel { get; set; } = "这是一个标签"; [CreateCustomControl("进阶设置","其它")] public ConfigModel.ViewModel.MyUControlModel MyUControlModel { get; set; } = new ViewModel.MyUControlModel(); public List BindingList { get; set; } //被绑定的列表 public TestData TData { get; set; } //二级对象,该属性没有添加特性,它里面的属性也可以被创建控件 //继承ICheckParameters接口,当配置框被点击“确定”时会被调用作为检测用,此特性必须放在返回string的没参数函数中,函数返回非空字符表示检查不通过并返回对应错误信息,此函数可以进行多个属性值的详细检测,例如下面例子就表示Port的值不能为9000,也可以添加某个属性的值不能小于某个属性值之类的检查 public string CheckParametersValid() { if (Port == 9000) return "端口不能为9000"; return string.Empty; } public void Completion() { Debug.WriteLine("这是确定完成前最后调用函数,可以做一些转换或保存操作"); } } public class TestData : ICheckParameters { [CreateTextBox("第三设置", "测试组", "测试1")] public string Test1 { get; set; } [CreateTextBox("第三设置", "测试组", "测试2", IsMultiline = true, Height = 120)] public string Test2 { get; set; } public string CheckParametersValid() { if (Test1 == "123") return "测试1的值不能为123"; return null; } } //枚举,对应生成下拉框,如果子项不添加【ComboBoxItemName】特性,就显示原本内容 public enum DBType { MySQL, SqlServer } //枚举,子项添加了【ComboBoxItemName】特性,内容显示对应文本内容 public enum VisionType { [ComboBoxItemName("算法1")] One, [ComboBoxItemName("算法2")] Two, [ComboBoxItemName("算法3")] Three, [ComboBoxItemName("算法4")] Four, } ``` ```csharp //配置绑定列表 config_data.BindingList = GetBindingDatas(); // ConfigWin win = new ConfigWin(); win.Title = "我的配置框"; win.SaveParametersChange += Win_SaveParametersChange; //设置配置框绑定对象并打开配置框,设置配置文本 if (win.AddControlSource(config_data, config_file: "ConfigData.json")) win.ShowDialogWinWithConfigFile("Binding.json"); //绑定还原配置文件 ``` 即可生成 ![实体](Images/实体.gif) #### 依靠排列配置框 ```csharp public class DockData { //DockPanel的创建放在最上面 [CreateDockPanel("b2", ParentKey = "bottom")] //创建一个DockPanel,名为【b2】,它属于【bottom】 [CreateDockPanel("bottom", Dock = Dock.Bottom)] //创建一个DockPanel,名为【bottom】,它是向下停靠,它对应大类别,即【第一】 [CreateDockPanelGroup(Dock.Left, GroupWidth = 280)] //【组1】是在根DockPanel中向左停靠,宽度280 [CreateTextBox("第一", "组1", "字符串1", GroupIndex = 1)] //文本框控件 public string TestStr1 { get; set; } [CreateNumeric("第一", "组1", "整数2")] //数字框控件 public int TestNum2 { get; set; } [CreateComboBox("第一", "组1", "组合3")] //下拉框控件 public DType DTypeDType { get; set; } //--------------------------------------------------------------------------------------------------------------------------------- [CreateDockPanelGroup(Dock.Top)] //【组2】在根DockPanel中向上停靠 [CreateTextBox("第一", "组2", "服务器1")] //文本框控件 public string Server1 { get; set; } [CreateTextBox("第一", "组2", "服务器2")] //文本框控件 public string Server2 { get; set; } //--------------------------------------------------------------------------------------------------------------------------------- [CreateDockPanelGroup(Dock.Left, GroupWidth = 300, ParentKey = "bottom")] //【组3】是在【bottom】DockPanel中向左停靠,宽度300 [CreateNumeric("第一", "组3", "数字1", GroupIndex = 0)] //数字框控件 public int MyNum1 { get; set; } [CreateNumeric("第一", "组3", "数字2")] //数字框控件 public int MyNum2 { get; set; } [CreateNumeric("第一", "组3", "数字3")] //数字框控件 public int MyNum3 { get; set; } [CreateNumeric("第一", "组3", "数字4")] //数字框控件 public int MyNum4 { get; set; } //--------------------------------------------------------------------------------------------------------------------------------- [CreateDockPanelGroup(Dock.Right, GroupWidth = 200, ParentKey = "bottom")] //【组4】是在【bottom】DockPanel中向右停靠,宽度200 [CreateNumeric("第一", "组4", "数字5")] //数字框控件 public int MyNum5 { get; set; } [CreateNumeric("第一", "组4", "数字6")] //数字框控件 public int MyNum6 { get; set; } [CreateNumeric("第一", "组4", "数字7")] //数字框控件 public int MyNum7 { get; set; } //--------------------------------------------------------------------------------------------------------------------------------- [CreateNumeric("第一", "组5", "数字8")] //数字框控件 public int MyNum8 { get; set; } //--------------------------------------------------------------------------------------------------------------------------------- [CreateNumeric("第一", "组6", "数字9")] //数字框控件 public int MyNum9 { get; set; } [CreateDockPanelGroup(Dock.Top, ParentKey = "b2")] [CreateNumeric("第一", "组6", "数字10")] //数字框控件 public int MyNum10 { get; set; } //--------------------------------------------------------------------------------------------------------------------------------- [CreateDockPanelGroup(Dock.Top, ParentKey = "b2")] //【组内组】是在【b2】DockPanel中向上停靠 [CreateNumeric("第一", "组内组", "数字11")] //数字框控件 public int MyNum11 { get; set; } [CreateNumeric("第一", "组内组", "数字12")] //数字框控件 public int MyNum12 { get; set; } /* 上面生成控件顺序解说: * 以上各个组都属于【第一】的大类别中,所以下面去掉大类别 * 从各个组的设置中来看,各个组的生成顺序是 【组3 - 组1 - 组2 - 组4 - 组5 - 组6 - 组内组】,因为组3的GroupIndex为0,组1的GroupIndex为1,所以组3先生成再生成组1,其它的按上到下生成 * 当生成组3时,组3对应的DockPanel不是根而名为【bottom】的DockPanel,此时系统会生成【bottom】DockPanel,【bottom】的上级为根DockPanel并且向下停靠 * 开始生成组3,组3生成在【bottom】内,并且向左停靠,宽度300. * 开始生成组1,组1的DockPanel为根DockPanel,它向左停靠,宽度为280. * 开始生成组2,组2的DockPanel为根DockPanel,它向上停靠,亮度没有设置,按组2自动生成高度来生成 * 开始生成组4,组4生成在【bottom】内,它向右停靠,宽度为200 * 开始生成组5,组5生成在根DockPanel内,由于此时根DockPanel,已有向下的【bottom】,向左的【组1】,向上的【组2】,剩余的位置被【组5】占上 * 开始生成组6,组6生成在【b2】中,而【b2】是在【bottom】内的,此时开始生成【b2】的DockPanel,由于此时【bottom】DockPanel,已在向左的【组3】,向右的【组4】,那中中间的位置就有【b2】占据,组6生成在【b2】内,向上停靠 * 开始生成组内组,组内组生成在【b2】中,由于此时【b2】已有向上的【组6】了,所以【组内组】就生成在它下面并向上停靠 * 最终生成各组 */ } public enum DType { Typ1, Typ2, Typ3, Typ4 } ``` ```csharp //停靠配置类,可以设置各个组的停靠 DockData data = new DockData(); //该类中有生成各组停靠顺序解说 ConfigWin win = new ConfigWin() { Title = "排列窗口" }; win.Width = 800; win.Height = 500; if (win.AddControlSource(data)) { win.SetPanelTitleWidht(60); //设置控件标题宽度统一为60 win.ShowDialogWin(); } ``` 即可生成 ![依靠排列](Images/依靠排列.jpg) #### 动态类绑定配置框 ```csharp dynamic obj = new ExpandoObject(); //设置这个属性可使UI更新时可更新到原对象上 obj.Txt = "ABCDEFG"; obj.Number = 123456; ConfigWin win = new ConfigWin(); win.Title = "动态类绑定"; win.AddTextBox("", "", obj, "Txt", "文本", necessary: true); win.AddNumeric("", "", obj, "Number", "数字", necessary: true); win.ShowDialogWin(true); ``` 即可生成 ![动态类绑定](Images/动态类绑定.jpg) ## 项目说明 - 个人学习交流免费,商业应用需要授权。个人承接外包项目、个人开发商业项目等,公司内部使用、开发项目等均属于商业应用范畴。联系微信:**flashcom2011** 咨询授权事宜。 - 禁止使用ConfigCreate控件库开发违法应用,或使用从事其他非法目的违法犯罪行为。因此产生的法律责任与ConfigCreate无关。