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

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

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

Author24 — интернет-сервис помощи студентам
Доброго времени суток.
Вот сижу разбираюсь с созданием своих элементов управления. В частности, интересно реализовать элементы управления, которые есть в 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.01.2016, 11:27
Ответы с готовыми решениями:

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

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

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

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

1
Эксперт .NETАвтор FAQ
10410 / 5140 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
22.01.2016, 12:53 2
Цитата Сообщение от 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
22.01.2016, 12:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.01.2016, 12:53
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru