Как мне отобразить панель уведомлений в WinForms?
Вы все знаете "У вас есть новые ответы!" панель уведомлений на SO. Я хотел бы то же самое в форме, желательно так же гладко. Есть ли простой способ? Или я должен полностью создать это сам?
Мои поиски не дали хороших результатов, только много индикаторов выполнения и всплывающих окон в области системных уведомлений, но это не то, что я ищу.
Сообщения, которые я хочу отобразить, относятся к форме, а не ко всему приложению
5 ответов
Создайте две формы в своей форме, панель уведомлений, прикрепленную к вершине, а под ней панель контента, прикрепленную к вершине. В Form.Load установите высоту панели уведомлений на ноль. Не устанавливайте высоту на ноль в режиме конструктора, вы не сможете нажать на панель уведомлений, чтобы отредактировать ее.
Затем, когда вы получите уведомление, нарисуйте содержимое панели уведомлений и создайте System.Windows.Form.Timer, который увеличивает высоту панели уведомлений на несколько пикселей каждые несколько десятков миллисекунд или около того. Остановитесь, когда панель будет иметь желаемую высоту. Сделайте то же самое с отрицательной высотой, чтобы скрыть панель.
Это не требует перекраски или перерасчета размеров или позиций чего-либо, ничего не перерисовывает и выглядит гладко. Я сделал это, и это работает.
Вы можете просто анимировать панель, выпадающую из верхней части клиентской области формы.
Увеличение координаты y панели в цикле по времени. Панель начинала быть невидимой и медленно становилась видимой. (Панель должна начинаться с -panel.height и работать до 0.)
Это не сложно сделать с панелью или UserControl, но из-за неудобной части содержимое формы скользит вниз, когда полоса опускается вниз. Чтобы упростить это, я бы использовал SplitContainer. Верхняя разделительная панель содержит панель уведомлений, а расстояние до разделителя изначально равно 0. Сдвиньте панель в поле зрения, увеличив свойство SplitterDistance. Делая это таким образом, вы не должны беспокоиться о том, чтобы другое содержимое формы скользило вниз (что создает трудности, поскольку не позволяет использовать стыковку).
Единственный недостаток использования SplitContainer, о котором я могу подумать, заключается в том, что анимация панели будет немного отличаться: текст не будет прокручиваться вниз вместе с панелью, он будет отображаться на месте, когда панель опускается вниз. Если это вас беспокоит, вы можете исправить это, сдвинув текст (или вашу панель / пользовательский элемент управления) по мере увеличения расстояния разделителя (всего пара строк кода).
Отображение панели:
for (int i = 0; i <= 33; i++)
{
splitContainer1.SplitterDistance = i;
Thread.Sleep(5);
Refresh();
}
Скрытие бара:
for (int i = 33; i >= 0; i--)
{
splitContainer1.SplitterDistance = i;
Thread.Sleep(5);
Refresh();
}
Конечно, если вы не возражаете против панели уведомлений, просто покрывающей верхнюю часть вашей формы, то вы можете просто сделать все это с помощью панели.:)
Если вы хотите, чтобы он был ограничен определенной формой, это должно быть достаточно легко Panel
на форме с его Dock
установлен в DockStyle.Top
Затем поместите метку для описания и кнопку, которая его скрывает.
Я искал то же самое только сейчас и нашел это в проекте кода
Я еще не использовал его, поэтому я понятия не имею, насколько он прочный.