Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Реализация нестандартного интерфейса вкладок

47K
20 июля 2009 года
GRAFzol
8 / / 21.04.2009
Всем доброго времени суток.

Работаю в MS VS 2005, язык C#. Разрабатывается приложение - некая система проектирования. Ориентирование идет на интерфейс Quartus II, если кто знает.

Так вот, необходимо сделать интерфейс вкладок такой как и там, а именно: при открытии файлов проекта создается вкладка для работы с этим файлом, т.е. если это текстовый файл - то на вкладке текстовый редактор, если файл другого формата и назначения, то соответственно набор элементов на создаваемой вкладке другой. По двойному клику на иконке вкладки она закрывается.

Теперь вопрос: каким образом это можно реализовать?

Поидее для работы с вкладками есть компонент TabControl, но я понятия не имею как сделать на нем вышеописанную функциональность, т.к. мне надо иметь некие шаблоны вкладок, с различными наборами визуальных компонентов на них, для определенных типов файлов. И при открытии файлов создавать вкладку для каждого, по имеющемуся шаблону.

Я думал сделать таким образом: сделать несколько вкладок - шаблонов, сделать их невидимыми, а при открытии файла просто копировать вкладку-шаблон и делать ее видимой. Но как минимум вкладку сделать невидимой нельзя, это описано в документации. Так же не знаю как ее копировать.

Вобщем если у кого будут предложения - заранее благодарен.
1.9K
20 июля 2009 года
GreenRiver
451 / / 20.07.2008
Такого рода интерфейс легко сделать с помощью сторонних компонентов, я пользуюсь WeifenLuo.WinFormsUI.Docking (вообще их очень много, и платных и бесплатных). С помощью них интерфейс можно сделать а-ля Visual Studio, с перетаскиванием, стыковкой, вкладками - при этом все очень просто.
Т.к. эти библиотеки оперируют формами, достаточно сделать формы для каждого типа документа. При открытии файла создавать подходящую форму и передавать ей файл для отображения.
47K
21 июля 2009 года
GRAFzol
8 / / 21.04.2009
Спасибо за указание направления. Если не трудно - можете скинуть линки на материал по разработке с помощью данной библиотеки? Я погуглил по данной библиотеке, но что то толкового для себя не нашел, по крайней мере на первый взгляд.
1.9K
21 июля 2009 года
GreenRiver
451 / / 20.07.2008
http://sourceforge.net/projects/dockpanelsuite/files/ - здесь есть сама библиотека и файлы документации, не очень свежие, но хотя бы что-то

А вообще использовать ее просто:
1. На главную форму кладется компонент DockingPanel, свойство Dock = Fill.
2. Главной форме свойство IsMDIContainer = true
3. Окна, которые будут дочерними нужно унаследовать от DockContent. Т.е. у уже созданных форм нужно исправить:
 
Код:
public partial class FormChild : Form
    {
        public FormChild()
        {
            InitializeComponent();
        }
    }

на:
 
Код:
public partial class FormChild : DockContent
    {
        public FormChild()
        {
            InitializeComponent();
        }
    }

4. Чтобы показать окно которое уже прикреплено к главному надо использовать перегруженный метод Show, в который передается DockPanel
 
Код:
FormChild.Show(dockPanel);


P.S. здесь есть много компонентов, если вас не смущает их платность
47K
21 июля 2009 года
GRAFzol
8 / / 21.04.2009
Спасибо большое. Буду разбираться.
5
21 июля 2009 года
hardcase
4.5K / / 09.08.2005
SharpDevelop построен на этой библиотеке
http://www.icsharpcode.net/OpenSource/SD/
Исходники его содержат исчерпывающие примеры, я использовал эту библиотеку для реализации интерфейса "аля-вижуалстудия".
12K
21 июля 2009 года
lifs
163 / / 06.09.2007
Цитата: hardcase
SharpDevelop построен на этой библиотеке
http://www.icsharpcode.net/OpenSource/SD/
Исходники его содержат исчерпывающие примеры, я использовал эту библиотеку для реализации интерфейса "аля-вижуалстудия".



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

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

5
21 июля 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: lifs
Я не пользовался предложенной библиотекой, но тоже искал нечто подобное и бесплатное. Поэтому хотелось бы узнать, она более менее стабильна?

Гмм ну, зависит от примера (имел в виду пример модели интерфейса IDE). У меня работает совершенно стабильно, правда я не реализовывал функционал сохранения/восстановления состояния интерфейса - пока незачем.

1.9K
21 июля 2009 года
GreenRiver
451 / / 20.07.2008
Работает вполне стабильно, по-крайней мере перетаскивания, стыковка, сохранение/загрузка. А примерчик и правда падает довольно быстро :)

Кстати знает ли кто-нибудь аналогичную библиотеку, но без вкладок в области документов? Т.е. в области документов нужна возможность расположить некий контрол, который будет постоянно отображаться и в его область невозможна стыковка других окон?
Либо может это как-то можно реализовать насроив/дописав предложенную библиотеку?
5
21 июля 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: GreenRiver
Т.е. в области документов нужна возможность расположить некий контрол, который будет постоянно отображаться и в его область невозможна стыковка других окон?
Либо может это как-то можно реализовать насроив/дописав предложенную библиотеку?


А чем предложенная не подходит? Докируемость тех или иных наследников док-контента вполне настраивается и те, что являются "вкладками" основного контента нельзя докировать в бока формы.

47K
21 июля 2009 года
GRAFzol
8 / / 21.04.2009
Сильный оффтопик, но что б не создавать новой темы напишу тут (поиск результатов не дал, а может не умею пользоваться):
1. Возможно ли создание новой кнопки (Button) на форме по нажатию другой кнопки на форме? Именно создание, т.е. прорисовка и т.д., а не изменение свойства видимости с невидимого на видимое.
2. Возможно ли задание нужного мне имени создаваемого контрола?
(Утрированный пример: System.Windows.Forms.Button button+"_"+i.ToString() = new System.Windows.Forms.Button();)
Задумка такая, но реализовать не знаю как.
Все относится к тому же проекту, поэтому написал тут. Заранее спасибо.
5
21 июля 2009 года
hardcase
4.5K / / 09.08.2005
2GRAFzol: Создайте форму Form1, бросьте туда кнопку, далее откройте файл Form1.Designer.cs и всматривайтесь в него до полного просветления (метод InitializeComponent()).
47K
21 июля 2009 года
GRAFzol
8 / / 21.04.2009
Делал так, вроде все сделал по аналогии, но чуствуется проблема в том что в классе Form1 кнопки прописаны как private System.Windows.Forms.Button button1; а я не знаю как их добавить туда же.
47K
21 июля 2009 года
GRAFzol
8 / / 21.04.2009
C добавление кнопки разобрался, надо ее добавить было в список контролов активной формы, но остался вопрос про именование нового контрола.
1.9K
21 июля 2009 года
GreenRiver
451 / / 20.07.2008
Мне нужно как раз наоборот, чтобы в области документов (там где вкладки) находился только один компонент и он не должен иметь вкладки, т.к. он там будет один и никто туда пристыковываться права не должен иметь... Попробую покопаться в исходниках DockingSuite, может получится переписать.
1.9K
22 июля 2009 года
GreenRiver
451 / / 20.07.2008
Вопрос решен, если кому-нибудь понадобится то: чтобы избавить от вкладок в области документов и запретить туда стыковку других окон нужно:
1. установить свойство DocumentStyle у DockPanel
 
Код:
DockPanel.DocumentStyle = DocumentStyle.DockingSdi;

2. запретить стыковку других окон в область документов (не включать DockAreas.Document)
 
Код:
ConcreteDockContent.DockAreas = DockAreas.Float
                  | DockAreas.DockTop
                  | DockAreas.DockLeft
                  | DockAreas.DockRight
                  | DockAreas.DockBottom;


Кстати, ковыряя исходники я пришел к выводу, что пример вылетает скорее из-за ошибки в самом примере, а не в библиотеке. И то, что он иногда не восстанавливает интерфейс (мотивирует OutOfRange) кажется тоже связано с ошибкой в примере (на счет последнего не уверен, не было времени точно выяснить).
12K
23 июля 2009 года
lifs
163 / / 06.09.2007
Цитата: GreenRiver
Кстати, ковыряя исходники я пришел к выводу, что пример вылетает скорее из-за ошибки в самом примере, а не в библиотеке. И то, что он иногда не восстанавливает интерфейс (мотивирует OutOfRange) кажется тоже связано с ошибкой в примере (на счет последнего не уверен, не было времени точно выяснить).



То что баги именно в примере - это понятно. Меня интересовала бажность библиотеки в сравнении с примером :) А то если посмотреть только на пример... Но по словам hardcase и GreenRiver сама библиотека вполне стабильна.
Кстати о багах в примере. Встретил там такую вещь. Если дважды нажать на 2ую справа кнопку на тулбаре, то пример падает с ObjectDisposedException. А падает он из-за этого:

Код:
m_solutionExplorer.Show(dockPanel, DockState.DockRight);
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
5
23 июля 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: lifs
Видимо это тот случай когда не стоит судить о библиотеке по примеру :D


На ней целиком SharpDevelop работает...

12K
23 июля 2009 года
lifs
163 / / 06.09.2007
Цитата: hardcase
На ней целиком SharpDevelop работает...



Я имел ввиду пример автора, а не пример использования сторонними разработчиками :)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог