Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 16.05.2013
Сообщений: 24

Мелкие сложности при создании пользовательских элементов управления

22.01.2016, 11:27. Показов 1255. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Вот сижу разбираюсь с созданием своих элементов управления. В частности, интересно реализовать элементы управления, которые есть в 3D Max, а именно сворачивающуюся панель и боковую панель с компактной полоской прокрутки. Накопился ряд вопросов, на которые увы не могу найти ответ. Может кто сможет помочь?

1. Как в пользовательском элементе управления, унаследованном от UserControl и, соответственно, не имеющем свойства Text, в дизайнере при добавлении элемента на форму получить в пользовательский аналог Text-а актуальное значение свойства Name? UserControl1, UserControl2, UserControl3 и т. п., короче, как во всех готовых элементах управления, имеющих свойство Text. Добавляешь такой элемент управления и в нем сразу Text равен Name.

2. Есть пользовательский элемент управления со свойством NextPanel:
В дизайнере в этом свойстве появляется ComboBox со всеми CollapsiblePanel присутствующими на форме, что не совсем удобно. Можно ли как-то редактировать этот список? Оставить там только те CollapsiblePanel, которые, например, имеют в свойстве PreviousPanel null. Неудобно как-то…
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public partial class CollapsiblePanel : UserControl
{
 
    ...
 
    /// <summary>
    /// Ссылка на следующую панель. Следующую располагает автоматически под текущей.
    /// </summary>
    [Description("Ссылка на следующую панель. Следующую располагает автоматически под текущей.")]
    [DisplayName("NextPanel")]
    [Category("Сворачивающаяся панель")]
    [DefaultValue(typeof(CollapsiblePanel), "нет")]
    public CollapsiblePanel NextPanel
    {
        get { return nextPanel; }
        set
        {
            ...
 
            nextPanel = value;
 
            ...
 
        }
    }
 
    ...
 
}

3. Можно ли в дизайнере отследить изменения элемента управления какими-то более вменяемыми способами чем приведенный ниже? В частности, хочется при перетаскивании элемента управления в дизайнере менять его привязку, что удобно, вот только там, увы, работает не все…
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
    /// <summary>
    /// Перемещение элемента управления
    /// </summary>
    /// <param name="e">Аргументы события</param>
    protected override void OnMove(EventArgs e)
    {
        base.OnMove(e);
            
        // Извращаемся как можем. В дизайнере при перемещении элемента управления отвязываем его
        if (DesignMode && Created)
        {
            int eps = 10;
            Point clientCursor = PointToClient(Cursor.Position);
            if (-eps < clientCursor.X && clientCursor.X < eps && -eps < clientCursor.Y && clientCursor.Y < eps)
            {
                CollapsiblePanel ss = null;
                if (previousPanel != null)
                {
                    ss = previousPanel;
                    if (previousPanel.nextPanel != null) previousPanel.nextPanel = null;
                    previousPanel = null;
 
                    // Если нужно вяжем следующие панели к бывшему родителю и перемещаем
                    if (ModifierKeys == Keys.Alt && nextPanel != null)
                    {
                        ss.nextPanel = nextPanel;
                        nextPanel.previousPanel = ss;
                        nextPanel = null;
                        ss.MoveNextPanel();
                    }
                }
            }
        }
    }

4. Есть панель со своей компактной полоской прокрутки. Прокрутка реализована путем изменения Location размещенных на ней контролов и анимации панелек (не знаю, может так не стоит делать, но уж больно все сложно в готовых классах… приходится изобретать велосипеды). Все бы хорошо, но при этом нельзя использовать свойство Dock так как добавленные контролы закрывают мои полоски прокрутки и вообще создают массу проблем... Хорошо было бы добавить специальную панельку, в которую перебрасывать все контролы добавляемые на пользовательский элемент управления, превратив пользовательский элемент управления в эдакого посредника. Что-то вроде specialPanel.Controls.Add(e.Control) в ControlAdded. В запущенной программе это работает хорошо, а вот в дизайнере так пропадает возможность добавлять объекты. Контрол добавляется, но тут же все откатывает назад без предупреждений об ошибке. В чем проблема? Можно ли вообще реализовать такое посредничество? Может свою прокрутку можно реализовать по-другому и проще?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.01.2016, 11:27
Ответы с готовыми решениями:

Взаимосвязь элементов управления при создании формы
Доброго времени суток! Проблема заключается в следующем: при создании формы необходимо взаимоувязать между собой ряд элементов управления...

Ошибка при создании коллекции элементов управления на форме
Подскажите, пожалуйста, как правильно создать коллекцию элементов управления на форме? Мне нужен динамический массив элементов управления...

Оптимизация большого количества пользовательских элементов управления
Задача такова: необходимо создать элемент управления с предложением в котором выделяется каждое слово (слово при наведении выделяется...

1
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
22.01.2016, 12:53
Цитата Сообщение от t7000 Посмотреть сообщение
1. Как в пользовательском элементе управления, унаследованном от UserControl и, соответственно, не имеющем свойства Text, в дизайнере при добавлении элемента на форму получить в пользовательский аналог Text-а актуальное значение свойства Name?
UserControl имеет свойство Text. Только оно protected и не отображается в панели свойств. Если вы переопределите его следующим образом:
C#
1
2
3
4
5
6
7
8
9
10
11
12
        [Browsable(true)]
        public override string Text
        {
            get
            {
                return base.Text;
            }
            set
            {
                base.Text = value;
            }
        }
Text появится в панели свойств и по умолчанию будет равно Name контрола.
Цитата Сообщение от t7000 Посмотреть сообщение
Все бы хорошо, но при этом нельзя использовать свойство Dock так как добавленные контролы закрывают мои полоски прокрутки и вообще создают массу проблем...
Для избежания этого вам нужно модифицировать ClientRectangle вашего контрола. Как описано здесь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.01.2016, 12:53
Помогаю со студенческими работами здесь

Добавление пользовательских элементов управления по нажатию на кнопку
Создал UserControl с названием ProductPanel. Как добавить его по нажатию на кнопку. Есть метод: public void CreateProductPanel() ...

Добавление пользовательских элементов управления на форму, в частности, ButtonChrome
Скачал пользовательский ЭУ из FAQ (ButtonChrome). А как его на форму поставить? :wall:

Не видит dll файл при создании "Библиотека элементов управления Windows Forms"
Вообщем ошибка на скрине по сути практически пустая форма. есть picturebox и label. Если нужна дополнительная информация скажите я...

Нет шаблона "Библиотека пользовательских элементов управления WPF"
Добрый день! Пытаюсь разбираться с созданием WPF компонентов. Не могу создать библиотеку своих компонентов, потому что ее тупо нет в...

Ошибка при создании пользовательского элемента управления
Я создал пользовательский элемент управления &quot;UserControl1&quot;, в него добавил label и назвал его txt. Вот его код. public partial...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru