Как мне отобразить панель уведомлений в 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Затем поместите метку для описания и кнопку, которая его скрывает.

Я искал то же самое только сейчас и нашел это в проекте кода

Я еще не использовал его, поэтому я понятия не имею, насколько он прочный.

Другие вопросы по тегам