Skip to main content
Исчезание формы Windows Forms в C#
Рейтинг 

Форма Windows Forms в C# может быть запрограммирована с эффектом исчезания и исчезать с помощью параметров прозрачности. Действительный код C# не слишком сложный, просто необходимо его соответствующим образом структурировать.

Появление и исчезание выполняется с помощью простого цикла свойства Opacity формы:

for (double i = this.Opacity; i <= 1; i += fadeRate)

{

ChangeOpacity(i);

}

if (this.Opacity != 1.00)

ChangeOpacity(1.00);

Почему код C# вызывает ChangeOpacity вместо простой установки числа для этого свойства Opacity? Если коротко, то потому, что приложение использует многопотоковость.

Многопотоковость

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

Что может привести к проблемам? Функции исчезания C# и форма Windows Forms будут в отдельных потоках. Последняя версия платформы .Net Framework не разрешает межпотоковые вызовы.

Чтобы обойти это, можно использовать делегаты. Приведенная выше функция C# использует вызов ChangeOpacity, который будет создавать делегата для доступа к свойству Opacity формы в том же потоке:

private delegate void ChangeOpacityDelegate(double value);

private void ChangeOpacity(double value)

{

     if (this.InvokeRequired)

     {

ChangeOpacityDelegate del = new ChangeOpacityDelegate(ChangeOpacity);

          object[] parameters = { value };

          this.Invoke(del, value);

     }

     else

     {

//Your code goes here, in this case:

this.Opacity = value;

     }

}

Обратите внимание, что можно вызвать любую нужную функцию C# и передать любые нужные параметры.

События мыши в C#

Потребуются только два события мыши в C#, MouseEnter и MouseLeave. Чтобы вызвать функции появления (FadeIn) и исчезания (FadeOut) C#, необходим следующий простой исходный код:

ThreadStart fadeInStart = new ThreadStart(FadeIn);

fadeIn = new Thread(fadeInStart);

fadeIn.Start();

Конечно, для функции исчезания (FadeOut) следует заменить часть FadeIn.

Существует одна небольшая проблема. Событие MouseLeave формы будет порождаться, когда курсор "покинет" форму C#, "входя" в другой элемент управления, даже если он находится в той же форме. Простой способ обойти это состоит в добавлении следующего кода C# в начале события MouseLeave:

if (this.Bounds.Contains(Cursor.Position)) return;

Исключение переполнения

Краткое замечание: требуется обеспечить остановку всех работающих вызовов функций появления и исчезания в C# перед вызовом еще одной. Это необходимо делать, чтобы исключить переполнение стека, что может привести к сбою приложения. Просто воспользуйтесь вызовом Abort C#.

Проверьте, как происходит исчезание формы, загрузив пример исходного кода C#.

Элементы управления

Материалы по темам