Masalah EventToCommand vs InputBindings

Saya telah membuat solusi untuk mereproduksi masalah yang saya alami dengan MVVM-Light EventToCommand vs InputBindings. Masalahnya berkisar pada satu jendela yang membuka jendela lain dan jika saya memiliki InputBinding yang terhubung, katakan ke kunci escape dan tutup tampilan kedua, itu akan menutup tampilan kedua dan kembali ke tampilan pertama. Jika saya menggunakan EventToCommand dan kemudian memanggil perintah yang sama secara manual, itu menutup tampilan kedua, itu juga menutup tampilan pertama.

Saya kira ini agak sulit untuk dilihat tanpa kode, jadi saya telah membuat solusi pengujian untuk mereproduksi masalah tersebut.

Langkah-langkahnya adalah sebagai berikut:

Berfungsi seperti yang diharapkan

1) Klik tombol jendela pertama untuk membuka jendela kedua.

2) Tekan tombol escape pada tombol kedua untuk menggunakan pengikatan input

Kasus Masalah

1) Klik tombol jendela pertama untuk membuka jendela kedua.

2) Klik kotak teks "Halo" 3) Tekan tombol Escape untuk menggunakan jalur EventToCommand dan kedua jendela ditutup?

Contoh Solusi


person Cheval    schedule 07.07.2011    source sumber


Jawaban (2)


Anda harus memberi tahu mekanisme penanganan peristiwa WPF bahwa penekanan tombol telah ditangani di pengendali peristiwa Anda dan tidak boleh menggelembungkan rantai peristiwa. Jika Anda tidak melakukannya, kotak teks Anda memanggil close pada jendela aktif (window2) dan escape handler memanggil close pada jendela aktif (window1 karena window2 sudah ditutup oleh escape handler dari kotak teks). Jadi jika Anda memodifikasi fungsi Close2 Anda sebagai berikut semuanya berfungsi dengan baik:

    public void Close2(KeyEventArgs e)
    {
        if (e.Key == Key.Escape)
            Close();
        e.Handled = true;
    }
person AxelEckenberger    schedule 10.07.2011
comment
Tentu saja! Hanya karena itu WPF bukan berarti Windows Eventing berubah. Terima kasih. - person Cheval; 11.07.2011

Saya pikir masalahnya adalah karena Anda mengaitkan acara PreviewKeyDown di pendengar EventToCommand. Saya pikir ini bereaksi terhadap tombol yang turun dan menutup jendela sebelum peristiwa KeyUp dan KeyPress diaktifkan. Ini berarti KeyUp dan KeyPress akan diaktifkan di jendela utama, yang bereaksi dengan menutup.

Saya mengubah EventName menjadi PreviewKeyPress di sampel Anda, dan sepertinya hal itu memperbaiki masalah. Saya dapat menekan Escape dan hanya menutup jendela atas.

person NathanAW    schedule 07.07.2011
comment
Dalam kode sebenarnya saya mengubah ke PratinjauKeyUp dan itu juga sepertinya berhasil. Terima kasih. - person Cheval; 11.07.2011