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

Ваш аккаунт

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

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

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

C# Winform Позиционирование

72K
22 августа 2013 года
Num2
17 / / 22.08.2013
Всем привет.

Столкнулся с такой проблемой, делаю сейчас WinForm, объектом разработки является пользовательский элемент управления, унаследованный от UserControl, на котором динамически создается N(кол-во записей с базы) панелей (2 на скрине) в котором есть еще 3 TextBox.

Какое ТЗ, наводим на панель сообщений, TextBox с датой или временем исчезает, появляется кнопка закрыть, выводим мышку за пределы панели - TextBox появляется снова, а кнопка исчезает

Что у меня сейчас получается, динамически созданные TextBox'ы накладываются на панель, и ивент который отвечает за наведение мыши на панель не срабатывает. А там где навожу на чистую панель, TextBox исчезает, кнопка показывается, но потом пытаюсь навести на кнопку - ивент понимает это как я ушел с панели, кнопка сразу исчезает а TextBox ставится назад...

Как только не пытался сделать:
- весил ивент и на TextBox1, TextBox3, но получается как-то рагульно, мерцает....
- создавал еще 1 панель, пытался пытался на нее кидать ивенты, но TextBox всеравно и ее перекрывали
- создавал listView прозрачный, но и это не помогло...

Помогите плиз сделать чтоб оно правильно функционировало...
Вот что у меня сейчас есть http://pastebin.com/Nkz02Pgu
341
26 августа 2013 года
Der Meister
874 / / 21.12.2007
Это проблема winforms и красивого способа её решения не существует (к WPF прикрутили маршрутизируемые события из-за этого).
Код:
EventHandler handler = (sender, args) => ShowCloseButton(true);
panel1.MouseHover += handler;
foreach (Control control in panel1.Controls) {
    control.MouseHover += handler;
}

panel1.MouseLeave += (sender, args) => {
    if (!panel1.RectangleToScreen(panel1.ClientRectangle).Contains(Cursor.Position)) {
        ShowCloseButton(false);
    }
};

// ...

void ShowCloseButton(bool show) {
    textBox1.Visible = !show;
    button1.Visible = show;
}
Можно использовать задержку, отвязываться от MouseHover и MouseLeave, переопределять обработчики событий или даже цикл обработки оконных сообщений, но лучше всего переписать это под WPF.
327
22 августа 2013 года
UserNet2008
748 / / 03.04.2010
Примерно так or На скорую руку

Код:
panel.MouseHover+=new EventHandler(MyMouseHover)
panel.MouseLeave+=new EventHandler(MyMouseLeave)

void MyMouseHover(object sender, EventArgs e)
{
// Если надо!!! смотрим какой "object sender" or "EventArgs e" и делаем действие
}


void MyMouseLeave(object sender, EventArgs e)
{
// Если надо!!! смотрим какой "object sender" or "EventArgs e" и делаем действие
}
72K
22 августа 2013 года
Num2
17 / / 22.08.2013
Я так уже делал раньше... но оно мне никак не помогло, и к тому же, чем это отличается от того что я делаю сейчас!?

panel.MouseHover += (sender, e) => { };
panel.MouseLeave += (sender, e) => { };

На данный момент у меня немного другая уже версия кода, я получается на TextBox тоже повесил ховеры... вроде стало немного по-приятнее, но все равно, если мышкой вести по краю панели, а не по TextBox то кнопка исчезает...

код на данный момент. http://pastebin.com/Jz468eqG
327
22 августа 2013 года
UserNet2008
748 / / 03.04.2010
Это весь код or кусок кода?

Цитата:
public void messages(List<string> list_msg) // создание панелей для сообщений.


В этой процедуре как я понимаю заполняет List нужными объектами и событиями(*?) и всё. А вызывать события во время создания и (тем более без EventHandler or MouseEventHandler) это не есть правильно. Где обрабатывается события? Полная не понятка.

Цитата:
Я так уже делал раньше... но оно мне никак не помогло, и к тому же, чем это отличается от того что я делаю сейчас!?
panel.MouseHover += (sender, e) => { };
panel.MouseLeave += (sender, e) => { };


Вы создаёте события динамически, а это значит что нужно указать new
По ходу есть идея значит так:
Создаём UserControl со всеми элементами TextBox, Button and делаем все события которые нужны.
А потом показываем его в List

 
Код:
//типа такого
UserControl[] UC = new UserControl[N];
UC[1] = new UserControl1();
panel.Controls.Add(UC[1]);
40K
25 августа 2013 года
D129
228 / / 18.04.2012
Что-то вы со списками событий вообще уж преусложнили...
Посмотрите солюшен - главная идея изменить порядок эвентов, чтобы поведение было ожидаемым.....

Сделать это можно только выбрасывая обработку эвента с задержкой (в другом потоке).
Прикрепленные файлы:
17 Кб
Загрузок: 804
72K
26 августа 2013 года
Num2
17 / / 22.08.2013
Цитата: Der Meister
Это проблема winforms и красивого способа её решения не существует (к WPF прикрутили маршрутизируемые события из-за этого).
Код:
EventHandler handler = (sender, args) => ShowCloseButton(true);
panel1.MouseHover += handler;
foreach (Control control in panel1.Controls) {
    control.MouseHover += handler;
}

panel1.MouseLeave += (sender, args) => {
    if (!panel1.RectangleToScreen(panel1.ClientRectangle).Contains(Cursor.Position)) {
        ShowCloseButton(false);
    }
};

// ...

void ShowCloseButton(bool show) {
    textBox1.Visible = !show;
    button1.Visible = show;
}
Можно использовать задержку, отвязываться от MouseHover и MouseLeave, переопределять обработчики событий или даже цикл обработки оконных сообщений, но лучше всего переписать это под WPF.




спасибо, помогло, только тут нужно было юзать не panel1 а panel

72K
27 августа 2013 года
Num2
17 / / 22.08.2013
щас с другой проблемой столкнулся, при нажатии на кнопку "закрыть" динамическая панель закрывается норм, я ее скрываю, но те которые под ней находятся не подтягиваются на пустое место... предполагаю что из-за того что Location задан... пробовал делать -=120, но не помогло.. а если задавать новые координаты - оно все в кучу пихается... подскажите плиз

http://zalil.ru/upload/34698225 во, залил исходник, чтоб было легче ее реализовать

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