Timer untuk menjalankan acara WPF

Saya punya proyek di sini dan telah ditetapkan secara default bahwa tindakan terjadi oleh acara MouseEnter. Maksud saya, membuka Jendela, menutup, mengembalikan, apa pun, hanya terjadi melalui acara MouseEnter.

Saya diminta untuk membuat acara tersebut menyala hanya setelah 3 detik. Itu berarti bahwa pengguna akan menempatkan mouse pada kontrol dan hanya setelah 3 detik peristiwa tersebut harus terjadi untuk semua kontrol di jendela.

Jadi, saya memikirkan tentang pengatur waktu global atau semacamnya, yang akan menghasilkan false hingga pengatur waktu mencapai 3... Saya rasa begitulah...

Ya ampun, adakah yang tahu bagaimana cara membuat hal seperti itu?

Terima kasih!!


person Armando Freire    schedule 09.09.2012    source sumber
comment
Tidak bisakah kamu tidur saja selama 3 detik di acara MouseEnter?   -  person paparazzo    schedule 09.09.2012
comment
Tidur selama 3 detik di acara MouseEnter akan mengunci UI selama 3 detik.   -  person Wonko the Sane    schedule 01.11.2012


Jawaban (2)


Anda dapat menentukan kelas yang akan mengekspos metode DelayedExecute yang menerima tindakan untuk dieksekusi dan membuat pengatur waktu sesuai kebutuhan untuk eksekusi tertunda. Ini akan terlihat seperti ini:

public static class DelayedExecutionService
{
    // We keep a static list of timers because if we only declare the timers
    // in the scope of the method, they might be garbage collected prematurely.
    private static IList<DispatcherTimer> timers = new List<DispatcherTimer>();

    public static void DelayedExecute(Action action, int delay = 3)
    {
        var dispatcherTimer = new System.Windows.Threading.DispatcherTimer();

        // Add the timer to the list to avoid it being garbage collected
        // after we exit the scope of the method.
        timers.Add(dispatcherTimer);

        EventHandler handler = null;
        handler = (sender, e) =>
        {
            // Stop the timer so it won't keep executing every X seconds
            // and also avoid keeping the handler in memory.
            dispatcherTimer.Tick -= handler;
            dispatcherTimer.Stop();

            // The timer is no longer used and shouldn't be kept in memory.
            timers.Remove(dispatcherTimer);

            // Perform the action.
            action();
        };

        dispatcherTimer.Tick += handler;
        dispatcherTimer.Interval = TimeSpan.FromSeconds(delay);
        dispatcherTimer.Start();
    }
}

Maka Anda bisa menyebutnya seperti ini:

DelayedExecutionService.DelayedExecute(() => MessageBox.Show("Hello!"));

or

DelayedExecutionService.DelayedExecute(() => 
{
    DoSomething();
    DoSomethingElse();
});
person Adi Lester    schedule 09.09.2012
comment
Wow! Solusi yang luar biasa, Pak!! Ini bekerja dengan sempurna!! Saya hanya akan memikirkan tentang umpan balik visual, seperti lingkaran yang tumbuh di sekitar kursor, atau sesuatu yang serupa!! Terima kasih banyak! - person Armando Freire; 09.09.2012
comment
@ArmandoFreire Senang mendengarnya. Perhatikan bahwa saya memodifikasi kode untuk menghindari kemungkinan kebocoran memori. - person Adi Lester; 09.09.2012
comment
Tentu @AdiLester, saya baru saja memperbarui milik saya juga! Kode ini menghemat banyak waktu di sini!! Sangat berterima kasih! - person Armando Freire; 09.09.2012
comment
Hai @Adi, bagaimana cara menambahkan lebih dari satu metode pada acara itu? Maksud saya, saya mencoba menjalankan dua metode, (misalnya memanggil dua kotak pesan) tetapi tidak berhasil. Apakah saya harus memanggil fungsi itu dua kali? - person Armando Freire; 15.09.2012
comment
@ArmandoFreire Delegasi yang Anda lewati dapat menjalankan beberapa pernyataan. Saya telah memperbarui jawaban saya untuk menunjukkan hal itu. - person Adi Lester; 15.09.2012
comment
Apakah ada cara untuk melakukan hal yang sama di template XAML? Saya mencoba melakukan animasi ketika tombol diklik tetapi saya tidak ingin acara Click diaktifkan sebelum animasi selesai. - person Stefan Vasiljevic; 19.07.2014
comment
@StefanVasiljevic Dalam hal ini Anda dapat mendaftar ke acara Completed storyboard dan menjalankan logika Anda di sana. - person Adi Lester; 19.07.2014
comment
@StefanVasiljevic Ya. Google acara Completed - Saya yakin Anda akan menemukan banyak contoh. - person Adi Lester; 19.07.2014
comment
dapatkah tolong bantu saya, saya mencoba menerapkan kode ini untuk menunda pengaktifan peristiwa perubahan teks, dan saya agak bingung... - person Little Programmer; 19.07.2016
comment
Saya ingin menunda bahkan agar tidak menyala setiap kali dipanggil selama satu putaran selama 3 detik. - person Little Programmer; 19.07.2016
comment
@LittleProgrammer Anda mungkin mencari pengikatan tertunda: jonathanantoine.com/2011/09/21/ - person Adi Lester; 19.07.2016

Saya hanya ingin menambahkan solusi yang lebih sederhana:

public static void DelayedExecute(Action action, int delay = 3000)
{
    Task.Factory.StartNew(() => 
    {
        Thread.Sleep(delay);
        action();
    }
}

Kemudian gunakan seperti di jawaban lain ini

person Louis Kottmann    schedule 15.09.2012
comment
Ini memang lebih sederhana, tapi menurut saya Sleep harus dihindari sebisa mungkin. - person Adi Lester; 15.09.2012
comment
@AdiLester bisakah Anda mengomentari alasannya? - person Louis Kottmann; 15.09.2012
comment
Artikel ini menjelaskan beberapa alasan: msmvps.com/blogs/peterritchie/archive/2007/04/26/ - person Adi Lester; 15.09.2012