Привести объект динамически обратно к тому, что он был - PullRequest
0 голосов
/ 26 июня 2018

Я хочу добавить элементы в Dockpanel.Я получаю Предметы (например, Изображение, Кнопку и т. Д.) В качестве Объекта.

Как я могу привести объект обратно к тому, что он был, и добавить в Dockpanel?

Я пробовал что-то подобное

Dockpanel.Children.Add((T)Convert.ChangeType(object, typeof(T)));

1 Ответ

0 голосов
/ 26 июня 2018

Проблема

Проблема с вашим кодом состоит в том, что вы не можете просто добавить 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 с и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...