Saya sedang menulis dialog modal dalam WPF. Bagaimana cara mengatur jendela WPF agar tidak memiliki tombol tutup? Saya masih ingin itu WindowState
memiliki judul bar normal.
Saya menemukan ResizeMode
,, WindowState
dan WindowStyle
, tetapi tidak satu pun dari properti itu yang memungkinkan saya untuk menyembunyikan tombol tutup tetapi menunjukkan bilah judul, seperti dalam dialog modal.
Jawaban:
WPF tidak memiliki properti bawaan untuk menyembunyikan tombol Tutup bilah judul, tetapi Anda dapat melakukannya dengan beberapa baris P / Invoke.
Pertama, tambahkan deklarasi ini ke kelas Window Anda:
Kemudian masukkan kode ini ke acara Window
Loaded
:Dan begitulah: tidak ada lagi tombol Tutup. Anda juga tidak akan memiliki ikon jendela di sisi kiri bilah judul, yang berarti tidak ada menu sistem, bahkan ketika Anda mengklik kanan bilah judul - semuanya berjalan bersamaan.
Perhatikan bahwa Alt+ F4masih akan menutup Window. Jika Anda tidak ingin membiarkan jendela ditutup sebelum utas latar belakang selesai, maka Anda juga bisa mengganti
OnClosing
dan mengaturCancel
ke true, seperti yang disarankan Gabe.sumber
SetWindowLongPtr
.Saya baru saja mengalami masalah yang sama dan solusi Joe White bagi saya sederhana dan bersih. Saya menggunakannya kembali dan mendefinisikannya sebagai properti Window yang terlampir
Kemudian di XAML Anda cukup mengaturnya seperti ini:
sumber
Setel
WindowStyle
properti ke Tidak Ada yang akan menyembunyikan kotak kontrol bersama dengan bilah judul. Tidak perlu panggilan abadi.sumber
this.DragMove();
ke jendelaMouseDown
acaraIni tidak akan menghilangkan tombol tutup, tetapi itu akan menghentikan seseorang menutup jendela.
Letakkan ini di kode Anda di belakang file:
sumber
Window
yang diatur sebagai dialog modal akan menggangguWindow
pengaturanDialogResult
propertinya dan mungkin membuatnya tidak dapat digunakan. stackoverflow.com/questions/898708/cant-set-dialogresult-in-wpfUntuk menonaktifkan tombol tutup, Anda harus menambahkan kode berikut ke kelas Window Anda (kode diambil dari sini , diedit dan diformat ulang sedikit):
Kode ini juga menonaktifkan item dekat di menu Sistem dan melarang menutup dialog menggunakan Alt + F4.
Anda mungkin ingin menutup jendela secara terprogram. Hanya menelepon
Close()
tidak akan berhasil. Lakukan sesuatu seperti ini:sumber
Saya sedang mencoba jawaban Viachaslau karena saya suka ide untuk tidak melepas tombol tetapi menonaktifkannya, tetapi untuk beberapa alasan itu tidak selalu berhasil: tombol tutup masih diaktifkan tetapi tidak ada kesalahan apa pun.
Di sisi lain, ini selalu berhasil (pengecekan kesalahan dihilangkan):
sumber
Window
metode ekstensi dalam proyek saya.Properti yang akan diatur adalah =>
WindowStyle="None"
sumber
Saya hanya menambahkan implementasi saya atas jawaban Joe White menggunakan Perilaku Interaktivitas (Anda perlu merujuk System.Windows.Interactivity).
kode:
pemakaian:
sumber
Biarkan pengguna "menutup" jendela tetapi benar-benar hanya menyembunyikannya.
Di acara Tutupan jendela, sembunyikan jendela jika sudah terlihat:
Setiap kali utas latar dijalankan, tampilkan kembali jendela UI latar belakang:
Saat mengakhiri eksekusi program, pastikan semua jendela dapat ditutup:
sumber
Jadi, ini masalah Anda. Tombol tutup di kanan atas bingkai jendela bukan bagian dari jendela WPF, tetapi milik bagian bingkai jendela yang dikendalikan oleh OS Anda. Ini berarti Anda harus menggunakan Win32 interop untuk melakukannya.
secara alternatif, Anda dapat menggunakan noframe dan memberikan "bingkai" sendiri atau tidak memiliki bingkai sama sekali.
sumber
Berikut ini adalah tentang menonaktifkan tombol Tutup dan Maksimalkan / Minimalkan, itu tidak benar benar menghapus tombol (tetapi itu menghapus item menu!). Tombol-tombol pada bilah judul digambar dalam keadaan dinonaktifkan / abu-abu. (Saya sendiri belum siap untuk mengambil alih semua fungsionalitasnya ^^)
Ini sedikit berbeda dari solusi Virgoss karena ia menghilangkan item menu (dan pemisah trailing, jika diperlukan) alih-alih hanya menonaktifkannya. Ini berbeda dari solusi Joe Whites karena tidak menonaktifkan seluruh menu sistem dan, dalam kasus saya, saya dapat menyimpan sekitar tombol dan ikon Perkecil.
Kode tindak juga mendukung penonaktifan tombol Maximize / Minimize karena, tidak seperti tombol Close, menghapus entri dari menu tidak menyebabkan sistem membuat tombol "dinonaktifkan" meskipun menghapus entri menu tidak menonaktifkan fungsionalitas tombol.
Ini bekerja untuk saya. YMMV.
Penggunaan: Ini harus dilakukan SETELAH sumber diinisialisasi. Tempat yang baik adalah menggunakan acara SourceInitialized of the Window:
Untuk menonaktifkan fungsionalitas Alt + F4 metode mudah adalah dengan memasang acara Membatalkan dan menggunakan mengatur bendera ketika Anda benar-benar ingin menutup jendela.
sumber
Kode XAML
harus bekerja
Sunting - untuk instan Anda Thread ini menunjukkan bagaimana hal itu dapat dilakukan tetapi saya tidak berpikir Window memiliki properti untuk mendapatkan apa yang Anda inginkan tanpa kehilangan bilah judul normal.
Sunting 2 Thread ini menunjukkan cara untuk melakukannya, tetapi Anda harus menerapkan gaya Anda sendiri ke menu sistem dan itu menunjukkan cara bagaimana Anda bisa melakukannya.
sumber
Coba tambahkan acara Penutupan ke jendela. Tambahkan kode ini ke pengendali acara.
Ini akan mencegah jendela dari menutup. Ini memiliki efek yang sama dengan menyembunyikan tombol tutup.
sumber
Gunakan ini, dimodifikasi dari https://stephenhaunts.com/2014/09/25/remove-the-close-button-from-a-wpf-window :
sumber
Ini tidak menyembunyikan tombol tetapi akan mencegah pengguna bergerak maju dengan mematikan jendela.
sumber
properti jendela goto diatur
kamu tidak akan mendapatkan tombol tutup ...
sumber
WindowStyle = "None"
- perhatikan sintaks Anda. Untuk yang lain, ini adalah pendekatan shotgun yang juga menghilangkan bilah judul, membuat kotak itu jelek dan kurang judul, ketika ada begitu banyak cara yang lebih baik untuk menangani ini (sebagaimana dibuktikan oleh jawaban lain), dan merupakan jawaban rangkap.Seperti yang dinyatakan dalam jawaban lain, Anda dapat menggunakan
WindowStyle="None"
untuk menghapus Judul Bar sama sekali.Dan, seperti yang dinyatakan dalam komentar untuk jawaban-jawaban lainnya, ini mencegah jendela menjadi tidak dapat diseret sehingga sulit untuk memindahkannya dari posisi awalnya.
Namun, Anda dapat mengatasi ini dengan menambahkan satu baris kode ke Konstruktor di file Window Behind Code:
Atau, jika Anda lebih menyukai Sintaks Lambda:
Ini membuat seluruh Window dapat diseret. Kontrol interaktif apa pun yang ada di Window, seperti Buttons, akan tetap berfungsi seperti biasa dan tidak akan bertindak sebagai drag-handle untuk Window.
sumber
Setelah banyak mencari jawaban untuk ini, saya mengerjakan solusi sederhana ini yang akan saya bagikan di sini dengan harapan dapat membantu orang lain.
Saya mengatur
WindowStyle=0x10000000
.Ini mengatur
WS_VISIBLE (0x10000000)
danWS_OVERLAPPED (0x0)
nilai-nilai untuk Gaya Jendela. "Tumpang tindih" adalah nilai yang diperlukan untuk menampilkan bilah judul dan batas jendela. Dengan menghapusWS_MINIMIZEBOX (0x20000)
,WS_MAXIMIZEBOX (0x10000)
danWS_SYSMENU (0x80000)
nilai-nilai dari nilai gaya saya, semua tombol dari bilah judul telah dihapus, termasuk tombol Tutup.sumber
WindowStyle
adalah enumerasi yang nilainya tidak sesuai dengan konstanta Windows API; paksaan nilai untukWindowStyle
pencacahan tidak akan berhasil. Yang pasti, saya telah memeriksa kode sumber .NET di ILSpy; nilai enum diterjemahkan ke Windows API di fungsi privatCreateWindowStyle
, dan jika fungsi menemukanWindowStyle
nilai yang tidak diketahui , itu hanya berlakuWindowStyle.None
. (Satu-satunya cara adalah dengan menggunakan properti internal_Style
dan_StyleEx
menggunakan refleksi, yang saya sangat sarankan menentang.)Gunakan
WindowStyle="SingleBorderWindow"
, ini akan menyembunyikan tombol max dan min dari WPF Window.sumber
close
tombolJika kebutuhan hanya untuk melarang pengguna menutup jendela, ini adalah solusi sederhana.
Kode XAML:
IsCloseButtonEnabled="False"
sumber