Как мне отобразить панель уведомлений в WinForms? - PullRequest
2 голосов
/ 23 апреля 2010

Вы все знаете "У вас есть новые ответы!" панель уведомлений на SO. Я хотел бы то же самое в форме, предпочтительно, так же гладко. Есть ли простой способ? Или я должен полностью создать это сам?

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

Сообщения, которые я хочу отобразить, относятся к форме, а не ко всему приложению

Ответы [ 5 ]

3 голосов
/ 23 апреля 2010

Вы можете просто анимировать панель, выпадающую из верхней части клиентской области формы.

Увеличение координаты y панели в цикле по времени. Панель начинала быть невидимой и медленно становилась видимой. (Панель будет начинаться с -panel.height и работать до 0.)

1 голос
/ 23 апреля 2010

Создайте две формы в своей форме, панель уведомлений, прикрепленную сверху, а под ней панель содержимого, прикрепленную к вершине. В Form.Load установите высоту панели уведомлений на ноль. Не устанавливайте высоту в ноль в режиме конструктора, вы не сможете щелкнуть панель уведомлений, чтобы изменить ее.

Затем, когда вы получите уведомление, нарисуйте содержимое панели уведомлений и создайте System.Windows.Form.Timer, который увеличивает высоту панели уведомлений на несколько пикселей каждые несколько десятков миллисекунд или около того. Остановитесь, когда панель будет иметь желаемую высоту. Сделайте то же самое с отрицательной высотой, чтобы скрыть панель.

Это не требует перерисовки или перерасчета размеров или позиций чего-либо, ничего не перерисовывает и выглядит гладко. Я сделал это, и это работает.

1 голос
/ 23 апреля 2010

Это не сложно сделать с панелью или 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();
    }

Конечно, если вы не возражаете против панели уведомлений, просто покрывающей верхнюю часть вашей формы, то вы можете просто сделать все это с помощью панели. :)

1 голос
/ 23 апреля 2010

Если вы хотите, чтобы оно было ограничено определенной формой, должно быть достаточно просто поместить Panel в форму с Dock, установленным в DockStyle.Top, затем поместить метку для описания и кнопку, которая скрывает это.

0 голосов
/ 26 октября 2011

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

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

...