pieterjann Ответов: 2

Добавьте показано событие для пользовательских элементов управления на C#


Привет,

У меня есть пользовательский элемент управления, и мне нужно отредактировать некоторые вещи на событии, подобные "показанным" с формами.

Я попробовал следующее Но это не сработало:

Добавлена следующая строка в конструктор:

this.Shown += this.HandleControlShown


и добавил Это к классу элемента управления:

public event EventHandler Shown;

private void HandleControlShown(object sender, EventArgs e)
{
    this.OnShown(EventArgs.Empty);
    //code to execute on shown event goes here.... but does not execute
}

protected virtual void OnShown(EventArgs e)
{
    EventHandler handler = this.Shown;
    if (handler != null)
    {
        handler(this, e);
    }
}


Где я делаю что-то не так?

__John_

UserControl не имеет показанного события, но у него есть событие загрузки.

pieterjann

Я знаю, но мне нужно показанное событие, событие загрузки приводится только один раз. Разве нет способа добавить показанное событие вручную?

__John_

Вы можете добавить свое собственное событие, но вам понадобится какой-то триггер, чтобы запустить его.
Что вы подразумеваете под показанным? то есть вывести на передний план? Краска? Или что-то еще?

2 Ответов

Рейтинг:
2

Jens Madsen, Højby

Хорошо, это старо, но поскольку я часто сталкиваюсь с проблемами, касающимися "вещей", которые нуждаются в видимом окне/ручке окна, я использую систему.Окна.Формы.Таймер вроде этого:

(Этот UserControl содержит собственный NamespaceTreeControl, который нуждается в видимом дескрипторе для инициализации)

   Private Sub NamespaceTreeControlLite_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            Dim tmr As New Timer() With {.Interval = 100, .Enabled = True}
            AddHandler tmr.Tick, AddressOf WaitForUCTRLVisible
End Sub


  Private Sub WaitForUCTRLVisible(sender As Object, e As EventArgs)
' Do stuff here that require .Visible=True
            If Me.Visible Then

                Try
                    Marshal.ThrowExceptionForHR(Me.NamespaceTreeBase1.Initialize(Me, Me.ClientRectangle))
                    Me.SetRootPath()
                Catch ex As Exception
                    MsgBox(ex.ToString(), MsgBoxStyle.Critical)
                End Try

                Dim tmr = TryCast(sender, Timer)
                If Not tmr Is Nothing Then
                    tmr.Dispose()
                    tmr = Nothing
                End If
            End If
        End Sub



(Это также освобождает PIA от необходимости иметь глобальные переменные, которые используются только для этой цели...)


Рейтинг:
1

Sanjay K. Gupta

Код объявления рекламировать, может быть полезным для вас.

//declare a delegate
public delegate ShownEventHandler(string args);

public event ShownEventHandler Shown;
private void HandleControlShown(object sender, EventArgs e)
{
 if(this.Shown!=null)
 {
    this.Shown(String.Empty/*your args*/);
    //code to execute on shown event goes here.... but does not execute
 }
}