Karena tidak ada button.PerformClick()
metode dalam WPF, apakah ada cara untuk mengklik tombol WPF secara terprogram?
144
WPF mengambil pendekatan yang sedikit berbeda dari WinForms di sini. Alih-alih memiliki otomatisasi objek yang dibangun ke dalam API, mereka memiliki kelas terpisah untuk setiap objek yang bertanggung jawab untuk mengotomatisasi itu. Dalam hal ini Anda perlu ButtonAutomationPeer
menyelesaikan tugas ini.
ButtonAutomationPeer peer = new ButtonAutomationPeer(someButton);
IInvokeProvider invokeProv = peer.GetPattern(PatternInterface.Invoke) as IInvokeProvider;
invokeProv.Invoke();
Berikut adalah posting blog tentang masalah ini.
Catatan: IInvokeProvider
antarmuka didefinisikan dalam UIAutomationProvider
majelis.
UIAutomationProvider
. Kemudian harus menambahkanusing System.Windows.Automation.Peers; using System.Windows.Automation.Provider;
((IInvokeProvider) (new ButtonAutomationPeer(someButton).GetPattern(PatternInterface.Invoke)).Invoke();
IInvokeProvider
antarmuka didefinisikan dalamUIAutomationProvider
majelis.Seperti yang dikatakan JaredPar, Anda dapat merujuk ke artikel Josh Smith tentang Otomasi. Namun jika Anda melihat melalui komentar di artikelnya, Anda akan menemukan cara yang lebih elegan untuk meningkatkan acara terhadap kontrol WPF
Saya pribadi lebih suka yang di atas daripada rekan-rekan otomatisasi.
sumber
new RoutedEventArgs(Button.ClickEvent)
tidak berhasil untuk saya. Saya harus menggunakannew RoutedEventArgs(Primitives.ButtonBase.ClickEvent)
. Kalau tidak, bekerja dengan baik!jika Anda ingin memanggil acara klik:
Dan jika Anda ingin tombolnya terlihat seperti ditekan:
dan tidak terbuka setelah itu:
atau gunakan ToggleButton
sumber
sumber
Salah satu cara untuk secara programatik "mengklik" tombol, jika Anda memiliki akses ke sumbernya, adalah dengan hanya memanggil pengendali event OnClick tombol (atau Jalankan ICommand yang terkait dengan tombol, jika Anda melakukan hal-hal dengan cara yang lebih WPF-y ).
Mengapa kau melakukan ini? Apakah Anda melakukan semacam pengujian otomatis, misalnya, atau mencoba melakukan tindakan yang sama dengan yang dilakukan tombol dari bagian kode yang berbeda?
sumber
Seperti yang dikatakan Greg D , saya berpikir bahwa alternatif untuk
Automation
mengklik tombol menggunakan pola MVVM (klik acara yang dibangkitkan dan perintah dieksekusi) adalah memanggilOnClick
metode menggunakan refleksi:sumber
Saat menggunakan pola Perintah MVVM untuk fungsi Tombol (praktik yang disarankan), cara sederhana untuk memicu efek Tombol adalah sebagai berikut:
Ini akan menggunakan objek Command yang dipicu tombol dan melewati CommandParameter yang ditentukan oleh XAML .
sumber
Masalah dengan solusi API Otomatisasi adalah, bahwa diperlukan referensi ke perakitan Kerangka
UIAutomationProvider
sebagai ketergantungan proyek / paket.Alternatifnya adalah meniru perilaku. Berikut ini adalah solusi saya yang diperluas yang juga menghubungkan pola-MVVM dengan perintah terikat - diimplementasikan sebagai metode ekstensi :
sumber