пятница, 14 июня 2013 г.

Закладки из ToolStrip-а

Преамбула

Однажды, работая с классическим TabControl-ем, мне понадобилось разместить закладки слева от контента (сверху у меня был ToolBar и закладки там были не в тему). Продолбавшись пару часов Исследуя данный вопрос, я осознал, что TabControl работает без глюков только в стандартном режиме. Стоит хоть что-то поменять и баги лезут изо всех щелей. После чего я стал копаться по форумам и нашел интересное решение - ToolStrip. В самом деле, кнопочки ToolStripButton во многом похожи на закладки - достаточно слегка изменить их визуальную часть и прикрутить разработать логическую составляющую. Еще немного покопавшись в интернете, я нашел несколько готовых вариантов. Однако, все они были "сырыми" и требовали доработок. После чего я, взяв за основу то, что сделали до меня, стал писать свой вариант. В настоящий момент прошло уже более года с тех пор, как я успешно использую эту систему. А значит, ее можно считать более-менее отлаженной и пришло время сделать ее общественным достоянием.

Общее описание




Начнем с того, как это вообще выглядит. Я подготовил небольшой демо-проект, результат работы которого показан на рисунке. Как не сложно заметить, наш пример состоит из двух tab-контролей и одной центральной части, прикрепленной сразу к обоим tab-контолям. Сами tab-контроли описываются классом TabStrip, являющимся наследником класса ToolStrip. А наша закладка - это TabStripButon - наследник от ToolStripButton. А это значит, что наши панельки с закладками содержат все возможности ToolStrip-а - могут содержать текст, обычные кнопочки, могут располагаться с любой стороны от основного контента и т. д.. Данный пример целиком подготовлен в дизайнере форм. Закладки тут добавляются из меню на правую кнопку мыши (добраться до основного меню добавления элементов не удалось). Стиль закладок задается в свойстве TabStrip.TabStyle.

Контент

Остается разобраться с тем, что у нас находится в центре окна и как это "что-то" связано с закладками. TabStrip взаимодействует с другими частями кода с помощью интерфейса IComponentSelector, реализация которого задается через свойство Selector. Через поле AllowedComponents реализация интерфейса предоставляет набор компонет, из которых будет осуществляться выбор при переключении закладок.
public interface IComponentSelector
{
 IEnumerable<IComponent> AllowedComponents { get; }
 IComponent SelectedComponent { get; set; }
 event EventHandler SelectedComponentChanged;
}
В настоящий момент есть одна реализация этого интерфейса - SingleViewPanel. Это панель, содержащая набор контролей и следящая за тем, что бы только один контроль был видимым.

Известные недочеты

Как уже упоминалось выше, мне не удалось встроить добавление закладки в меню добавления элементов ToolStrip-а и его пришлось вынести в меню на правую кнопку мыши. Кроме того, не стоит изменять отступы (Padding и Margin) - это приведет к некорректному отображению закладок.

Файлы

Все файлы вместе с демо-проектом собраны в один архив. Их можно скачать тут:
скачать с Яндекс диск

Комментариев нет:

Отправить комментарий