【C#】 如何通过泛型构建对象+如何后台添加控件

 如何通过泛型构建对象

private T CreatHcText<T>(string title) where T : FrameworkElement
{
    T obj = (T)Activator.CreateInstance(typeof(T));
    HandyControl.Controls.TitleElement.SetTitlePlacement(obj, HandyControl.Data.TitlePlacementType.Left);
    HandyControl.Controls.TitleElement.SetTitle(obj, title);
    obj.Margin = new Thickness(5);
    return obj;
}

首先我们通过typeof(T)拿到泛型的类型,然后同Activator.CreateInstance构造对象,最后通过强制转换转换成泛型对应的类型。

后台添加HandyControl控件

这边有个需求,需要根据http返回的内容动态添加控件,而且控件类型也要更具返回的内容指定。

也是动态生成不同的类型,这样的话数据模板也不好使了,只好后台动态添加了。

因为,控件类型不定,所以这里用到了泛型。

HandyControl 的控件可以通过附加属性设置标题,这样可以减轻布局的复杂性。

所以就有了如上代码:

HandyControl.Controls.TitleElement.SetTitle(obj, title); //附加属性的添加

最后是调用的过程

foreach (var item in _data_model.result.titleColumn)
{

    switch (item.columnType)
    {
        case BaseLibrary.MyEnum.ControlType.input:
            stackPanel.Children.Add(CreatHcText<HandyControl.Controls.TextBox>(item.columnChName));
        break;
        case BaseLibrary.MyEnum.ControlType.date:
            var t = CreatHcText<HandyControl.Controls.TextBox>(item.columnChName);
            t.Text = DateTime.Now.ToString("yyyy-MM-dd");
            stackPanel.Children.Add(t);
            break;
        case BaseLibrary.MyEnum.ControlType.select:
            var s = CreatHcText<HandyControl.Controls.ComboBox>(item.columnChName);
            s.ItemsSource = item.selectValue;
            stackPanel.Children.Add(s);
            break;
        case BaseLibrary.MyEnum.ControlType.judge:
            break;
        default:
            break;
    }
}

posted @ 2022-09-14 11:50  宋桓公  阅读(45)  评论(0编辑  收藏  举报