我厌倦了编写代码行:
SomeUIElement ui = new SomeUIElement();
Grid.Children.Clear();
Grid.Children.Add(ui);
所以我决定编写一个方法来确定元素的类型,然后清除子元素并将其添加到网格中。
这样的事情:
private void GridChildren(UIElement uc)
{
var element = uc.GetType();
Grid.Children.Clear();
Grid.Children.Add(element);
}
我可以这样打电话:
GridChilren(UserControl);
但是我一直收到错误:
Argument 1: cannot convert from 'System.Type' to 'System.Windows.UIElement'
关于如何确定传递给我的方法的usercontrol
类型的任何想法?
修改
我可以通过首先创建实例然后清除并添加到网格来调用它。但这不是我的问题。
是的,它会更方便,但是出于这个问题的目的,假设我 ONLY 想要了解如何在不自己编写的情况下创建类型的实例。
答案 0 :(得分:1)
好像你想创建一个UIElement
类型的实例,并将其添加为网格的唯一子元素。
代码的第一行(var element = uc.GetType()
)返回Type
类型的对象,当您尝试将其添加到网格的Children
集合时会导致异常(因为希望您添加UIElement
对象,而不是Type
对象。
你可以这样编写你的方法:
private void GridChildren(UIElement uc)
{
Grid.Children.Clear();
Grid.Children.Add(uc);
}
然后你会这样称呼它:
SomeUIElement ui = new SomeUIElement();
GridChildren(ui);
但这只会比“长手”版本节省一行。
以下方法将创建并向任何类型的UIElement
控件添加新的Panel
:
public void SetPanelChild<T>(Panel panel)
where T : UIElement, new()
{
T element = new T();
panel.Children.Clear();
panel.Children.Add(element);
}
在这里使用泛型的好处是你不需要打扰Activator.CreateInstance()
。你可以这样调用这个方法:
SetPanelChild<TextBlock>(myPanel);
然而,当您发现自己以编程方式创建控件时,可能有更好的方法来利用WPF提供的功能,例如MVVM模式和数据绑定。
答案 1 :(得分:0)
您正在寻找Activator.CreateInstance()
方法,该方法将使用Reflection创建一个类型的实例。
你仍然需要施展它。
或者(取决于你如何调用它),改为使用泛型类型参数。