Реализация нестандартного интерфейса вкладок
Работаю в MS VS 2005, язык C#. Разрабатывается приложение - некая система проектирования. Ориентирование идет на интерфейс Quartus II, если кто знает.
Так вот, необходимо сделать интерфейс вкладок такой как и там, а именно: при открытии файлов проекта создается вкладка для работы с этим файлом, т.е. если это текстовый файл - то на вкладке текстовый редактор, если файл другого формата и назначения, то соответственно набор элементов на создаваемой вкладке другой. По двойному клику на иконке вкладки она закрывается.
Теперь вопрос: каким образом это можно реализовать?
Поидее для работы с вкладками есть компонент TabControl, но я понятия не имею как сделать на нем вышеописанную функциональность, т.к. мне надо иметь некие шаблоны вкладок, с различными наборами визуальных компонентов на них, для определенных типов файлов. И при открытии файлов создавать вкладку для каждого, по имеющемуся шаблону.
Я думал сделать таким образом: сделать несколько вкладок - шаблонов, сделать их невидимыми, а при открытии файла просто копировать вкладку-шаблон и делать ее видимой. Но как минимум вкладку сделать невидимой нельзя, это описано в документации. Так же не знаю как ее копировать.
Вобщем если у кого будут предложения - заранее благодарен.
Т.к. эти библиотеки оперируют формами, достаточно сделать формы для каждого типа документа. При открытии файла создавать подходящую форму и передавать ей файл для отображения.
А вообще использовать ее просто:
1. На главную форму кладется компонент DockingPanel, свойство Dock = Fill.
2. Главной форме свойство IsMDIContainer = true
3. Окна, которые будут дочерними нужно унаследовать от DockContent. Т.е. у уже созданных форм нужно исправить:
{
public FormChild()
{
InitializeComponent();
}
}
на:
{
public FormChild()
{
InitializeComponent();
}
}
4. Чтобы показать окно которое уже прикреплено к главному надо использовать перегруженный метод Show, в который передается DockPanel
P.S. здесь есть много компонентов, если вас не смущает их платность
http://www.icsharpcode.net/OpenSource/SD/
Исходники его содержат исчерпывающие примеры, я использовал эту библиотеку для реализации интерфейса "аля-вижуалстудия".
http://www.icsharpcode.net/OpenSource/SD/
Исходники его содержат исчерпывающие примеры, я использовал эту библиотеку для реализации интерфейса "аля-вижуалстудия".
Я не пользовался предложенной библиотекой, но тоже искал нечто подобное и бесплатное. Поэтому хотелось бы узнать, она более менее стабильна?
А то скачал их демо, запустил, а оно тут же упало, буквально после нескольких кликов по паре кнопок. После других экспериментов с окнами их пример отказывался запускаться до тех пор, пока я не удалил config, мотивирую это исключением IndexOutOfRange :)
Гмм ну, зависит от примера (имел в виду пример модели интерфейса IDE). У меня работает совершенно стабильно, правда я не реализовывал функционал сохранения/восстановления состояния интерфейса - пока незачем.
Кстати знает ли кто-нибудь аналогичную библиотеку, но без вкладок в области документов? Т.е. в области документов нужна возможность расположить некий контрол, который будет постоянно отображаться и в его область невозможна стыковка других окон?
Либо может это как-то можно реализовать насроив/дописав предложенную библиотеку?
Либо может это как-то можно реализовать насроив/дописав предложенную библиотеку?
А чем предложенная не подходит? Докируемость тех или иных наследников док-контента вполне настраивается и те, что являются "вкладками" основного контента нельзя докировать в бока формы.
1. Возможно ли создание новой кнопки (Button) на форме по нажатию другой кнопки на форме? Именно создание, т.е. прорисовка и т.д., а не изменение свойства видимости с невидимого на видимое.
2. Возможно ли задание нужного мне имени создаваемого контрола?
(Утрированный пример: System.Windows.Forms.Button button+"_"+i.ToString() = new System.Windows.Forms.Button();)
Задумка такая, но реализовать не знаю как.
Все относится к тому же проекту, поэтому написал тут. Заранее спасибо.
1. установить свойство DocumentStyle у DockPanel
2. запретить стыковку других окон в область документов (не включать DockAreas.Document)
| DockAreas.DockTop
| DockAreas.DockLeft
| DockAreas.DockRight
| DockAreas.DockBottom;
Кстати, ковыряя исходники я пришел к выводу, что пример вылетает скорее из-за ошибки в самом примере, а не в библиотеке. И то, что он иногда не восстанавливает интерфейс (мотивирует OutOfRange) кажется тоже связано с ошибкой в примере (на счет последнего не уверен, не было времени точно выяснить).
То что баги именно в примере - это понятно. Меня интересовала бажность библиотеки в сравнении с примером :) А то если посмотреть только на пример... Но по словам hardcase и GreenRiver сама библиотека вполне стабильна.
Кстати о багах в примере. Встретил там такую вещь. Если дважды нажать на 2ую справа кнопку на тулбаре, то пример падает с ObjectDisposedException. А падает он из-за этого:
m_propertyWindow.Show(m_solutionExplorer.Pane, m_solutionExplorer);
m_toolbox.Show(dockPanel, new Rectangle(98, 133, 200, 383));
m_outputWindow.Show(m_solutionExplorer.Pane, DockAlignment.Bottom, 0.35);
m_taskList.Show(m_toolbox.Pane, DockAlignment.Left, 0.4);
CloseAllDocuments();
DummyDoc doc1 = CreateNewDocument("Document1");
DummyDoc doc2 = CreateNewDocument("Document2");
DummyDoc doc3 = CreateNewDocument("Document3");
DummyDoc doc4 = CreateNewDocument("Document4");
Видимо это тот случай когда не стоит судить о библиотеке по примеру :D
На ней целиком SharpDevelop работает...
Я имел ввиду пример автора, а не пример использования сторонними разработчиками :)