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;
}
C# Winform Позиционирование
Столкнулся с такой проблемой, делаю сейчас WinForm, объектом разработки является пользовательский элемент управления, унаследованный от UserControl, на котором динамически создается N(кол-во записей с базы) панелей (2 на скрине) в котором есть еще 3 TextBox.
Какое ТЗ, наводим на панель сообщений, TextBox с датой или временем исчезает, появляется кнопка закрыть, выводим мышку за пределы панели - TextBox появляется снова, а кнопка исчезает
Что у меня сейчас получается, динамически созданные TextBox'ы накладываются на панель, и ивент который отвечает за наведение мыши на панель не срабатывает. А там где навожу на чистую панель, TextBox исчезает, кнопка показывается, но потом пытаюсь навести на кнопку - ивент понимает это как я ушел с панели, кнопка сразу исчезает а TextBox ставится назад...
Как только не пытался сделать:
- весил ивент и на TextBox1, TextBox3, но получается как-то рагульно, мерцает....
- создавал еще 1 панель, пытался пытался на нее кидать ивенты, но TextBox всеравно и ее перекрывали
- создавал listView прозрачный, но и это не помогло...
Помогите плиз сделать чтоб оно правильно функционировало...
Вот что у меня сейчас есть http://pastebin.com/Nkz02Pgu
Код:
Код:
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" и делаем действие
}
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" и делаем действие
}
panel.MouseHover += (sender, e) => { };
panel.MouseLeave += (sender, e) => { };
На данный момент у меня немного другая уже версия кода, я получается на TextBox тоже повесил ховеры... вроде стало немного по-приятнее, но все равно, если мышкой вести по краю панели, а не по TextBox то кнопка исчезает...
код на данный момент. http://pastebin.com/Jz468eqG
В этой процедуре как я понимаю заполняет List нужными объектами и событиями(*?) и всё. А вызывать события во время создания и (тем более без EventHandler or MouseEventHandler) это не есть правильно. Где обрабатывается события? Полная не понятка.
Я так уже делал раньше... но оно мне никак не помогло, и к тому же, чем это отличается от того что я делаю сейчас!?
panel.MouseHover += (sender, e) => { };
panel.MouseLeave += (sender, e) => { };
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]);
UserControl[] UC = new UserControl[N];
UC[1] = new UserControl1();
panel.Controls.Add(UC[1]);
Посмотрите солюшен - главная идея изменить порядок эвентов, чтобы поведение было ожидаемым.....
Сделать это можно только выбрасывая обработку эвента с задержкой (в другом потоке).
Цитата: Der Meister
Это проблема winforms и красивого способа её решения не существует (к WPF прикрутили маршрутизируемые события из-за этого).
Можно использовать задержку, отвязываться от MouseHover и MouseLeave, переопределять обработчики событий или даже цикл обработки оконных сообщений, но лучше всего переписать это под 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;
}
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;
}
спасибо, помогло, только тут нужно было юзать не panel1 а panel
http://zalil.ru/upload/34698225 во, залил исходник, чтоб было легче ее реализовать
спасибо