Проблема
Проблема с вашим кодом состоит в том, что вы не можете просто добавить object
s к DockPanel.Children
, потому что это UIElementCollection
, означающее, что выможно только добавить UIElement
с к нему.
Решение
Следовательно, вместо
Dockpanel.Children.Add((T) Convert.ChangeType(obj, typeof(T)));
(чтоне компилируется) вам нужно привести объект, который вы хотите добавить к UIElement
следующим образом:
DockPanel.Children.Add((UIElement) obj);
Вам нужно позаботиться о том, чтобыobj
на самом деле является UIElement
, таким как Button
, Image
, TextBox
и т. Д., Или приведение к UIElement
завершится неудачей.
Рекомендация
Используйте вспомогательный метод или метод расширения , подобный этому
public static void AddChild(this DockPanel dockPanel, T childToAdd) where T : UIElement
{
dockPanel.Children.Add(childToAdd);
}
, который имеет преимущество в том, что прост в использовании и , допуская только допустимые входные данные благодаря общему ограничению where T : UIElement
, что означает ", где добавляемый объект должен быть производным от UIElement
" .
Затем можно вызвать метод следующим образом:
this.MyDockPanel.AddChild(new Image());
this.MyDockPanel.AddChild(new Button());
РЕДАКТИРОВАТЬ - Реальные требования
ОП уточнил их фактические требования, а именно:
Я получаю изображение в массиве объектов - я хочу привести его обратно к изображению - затем я хочу добавить его вDockpanel - тот же код должен работать и с кнопками
, что означает, что мы хотим добавить все элементы, содержащиеся в
object[] myItems = ...
, в наш DockPanel
с именем myDockPanel
.
Давайте воспользуемся нашим методом расширения сверху, и теперь мы можем сделать это:
object[] myItems = ...;
foreach(object obj in myItems)
{
this.myDockPanel.AddChild(obj as UIElement);
}
и вуаля, все готово - не нужно возвращаться к Image
, мыпросто приведите к UIElement
по причинам, описанным выше, и код работает также для Button
с и т. д.