代码拉取完成,页面将自动刷新
简单方便生成各类复杂配置框并绑定到自己的对象中。支持代码直接创建或定义一个实体类,并在属性上添加对应特性即可生成。并支持指定控件对指定属性值进行检查来确定可用性或可见性,也支持角角权限。属性值代码检查提示等。
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; }
}
//生成简单配置框
SimpleData data = new SimpleData("Node1", "节点1");
ConfigWin win = new ConfigWin();
win.Width = 350;
win.Height = 200;
win.Title = "修改节点属性";
if (win.AddControlSource(data))
win.ShowDialogWin();
即可生成
//声明配置框
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<ComboBoxData> tl = new List<ComboBoxData>()
{
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)
{
}
即可生成
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<VisionType> VisionTypes { get; set; } = new List<VisionType>() { 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<BindingData> 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,
}
//配置绑定列表
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"); //绑定还原配置文件
即可生成
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
}
//停靠配置类,可以设置各个组的停靠
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();
}
即可生成
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);
即可生成
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。