1 Star 0 Fork 0

黎宏 / ConfigCreate

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
README.md 19.61 KB
一键复制 编辑 原始数据 按行查看 历史
黎俊宏 提交于 2024-02-20 17:23 . 1. 添加说明

介绍

简单方便生成各类复杂配置框并绑定到自己的对象中。支持代码直接创建或定义一个实体类,并在属性上添加对应特性即可生成。并支持指定控件对指定属性值进行检查来确定可用性或可见性,也支持角角权限。属性值代码检查提示等。

方便生成

简单参数配置框

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);

即可生成

动态类绑定

项目说明

  • 个人学习交流免费,商业应用需要授权。个人承接外包项目、个人开发商业项目等,公司内部使用、开发项目等均属于商业应用范畴。联系微信:flashcom2011 咨询授权事宜。
  • 禁止使用ConfigCreate控件库开发违法应用,或使用从事其他非法目的违法犯罪行为。因此产生的法律责任与ConfigCreate无关。
C#
1
https://gitee.com/flashcom/config-create.git
git@gitee.com:flashcom/config-create.git
flashcom
config-create
ConfigCreate
master

搜索帮助