2015-03-11 3 views
1

Я создаю пользовательский набор инструментов в виде окон (например, тот, который вы выбираете элементами управления в VS Form Designer). Для того, чтобы получить изображение, которое появляется на стороне текста управления я использую это:Преобразование неизвестного класса в его базовый класс

ToolboxItem tbi = item as ToolboxItem; 
var image = tbi.Bitmap; 

Где элемент может быть любой тип контроля. Он работает так, как должно быть.

Проблема возникает, когда я пытаюсь использовать пользовательские элементы управления в панели инструментов. Скажем, я создаю этот класс:

public class PMLButton : Button 
{ 
} 

Затем, когда PMLButton передается переменной «пункт» это получить значок шестеренки, из таможенного контроля, как это должно быть. Но в этом случае я хотел бы показать значок кнопки по умолчанию для этого элемента.

Все инструменты, которые я буду использовать в панели инструментов, получены из стандартного класса управления Windows (Button, Label, Checkbox и т. Д.).

Если я применил переменную 'item' к ее базовому типу, она будет работать правильно и отобразить правильное изображение. Есть ли способ сделать это?

+0

Я не уверен, что получаю то, что вы хотите, но, вероятно, вы можете использовать Convert.ChangeType (https://msdn.microsoft.com/de-de/library/system.convert.changetype%28v=vs. 110% 29.aspx), но вы получите только возвращаемый объект, поэтому я не знаю, поможет ли эта помощь. Else Я думаю, лучшим решением было бы сделать простой 'if (item is Button) x = (item as Button)' check – Staeff

+0

@Staeff ChangeType не будет работать, потому что я должен указать тип, который я хочу преобразовать, что зависит на объект. Это всегда его базовый тип, но это могут быть кнопки, ярлыки, CheckBox и т. Д. Если это был мой первый вариант, но мне пришлось бы добавить if для каждого типа элемента управления. Это работает, но я думал, что это не изящное решение. – RBasniak

+0

Чтобы быть справедливым, существует только ограниченное количество стандартных элементов управления winforms. Наверное, вы также можете всегда использовать динамический тип. – Staeff

ответ

2

ToolBoxItem использует отражение, чтобы получить тип, поэтому его литье не изменит его поведения.

Самым простым решением является назначение набор инструментов растровый себя:

[ToolboxBitmap(typeof(Button))] 
public class PMLButton : Button 
{ 
} 

В качестве альтернативы, если элемент управления, содержащий точечный рисунок всегда один шаг вверх по дереву наследования, вы можете использовать:

var image = new ToolboxItem(item.GetType().BaseType).Bitmap; 

Я бы определенно пойти на решение атрибута, хотя, как PMLButton будет иметь кнопку растровое изображение в дизайнере тоже.

Смежные вопросы