Изменение прозрачности формы из пользовательского класса таймера - PullRequest
0 голосов
/ 25 ноября 2018

Я создал класс, который наследует класс таймера, потому что я хочу настроить функцию Tick, и я хочу использовать эту конкретную функцию во многих классах без необходимости каждый раз менять функцию во всех таймерах.

Public Class FadeInTimer
Inherits Timer

Public Sub New()
    MyBase.New()

    Me.Enabled = False
    Me.Interval = 75
End Sub

Private Sub FadeInTimer_Tick(sender As Object, e As EventArgs) Handles Me.Tick
    Dim workingAreaWidth As Integer = Screen.PrimaryScreen.WorkingArea.Width - Me.Width
    Me.Opacity += 0.1

    If Not Me.Location.X <= workingAreaWidth Then
        Me.Location = New Point(Me.Location.X - 30, Me.Location.Y)
    End If

    Me.Refresh()
    If Me.Opacity = 1 Then
        Me.Stop()
    End If
End Sub
End Class

Цель этой функции - сделать простое постепенное увеличение при создании формы.Проблема в том, что я не могу использовать «Я».потому что я нахожусь в классе Timer, так как я могу внести изменения в форму из этого класса.

1 Ответ

0 голосов
/ 25 ноября 2018

Первое, что нужно сделать, - это передать экземпляр формы, который должен исчезнуть, внутри конструктора пользовательского таймера, сохранить этот экземпляр в глобальной переменной класса и добавить обработчик тиков с помощью AddHandler , какпоэтому

Public Class FadeInTimer
    Inherits System.Windows.Forms.Timer
    Dim parent As Form

    Public Sub New(p As Form)
        MyBase.New()
        parent = p
        AddHandler MyBase.Tick, AddressOf FadeInTimer_Tick 

    End Sub

Теперь, когда вам нужно обратиться к «родительской» форме, вы используете переменную parent , а не оператор Me .Кроме того, каждый раз, когда вам нужно обратиться к таймеру, вы должны использовать MyBase выражение

Private Sub FadeInTimer_Tick(sender As Object, e As EventArgs) 
    Dim workingAreaWidth As Integer = Screen.PrimaryScreen.WorkingArea.Width - Parent.Width
    parent.Opacity += 0.1

    If Not parent.Location.X <= workingAreaWidth Then
        parent.Location = New Point(parent.Location.X - 30, parent.Location.Y)
    End If

    parent.Refresh()
    If parent.Opacity = 1 Then
        MyBase.Stop()
    End If
End Sub

Это можно проверить в LinqPad с помощью этого кода

Sub Main
    Dim f As Form = New Form()
    Dim t As FadeInTimer = New FadeInTimer(f)

    f.Opacity = 0
    t.Interval = 150
    t.Start()
    f.ShowDialog()

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...