Piszę modalne okno dialogowe w WPF. Jak ustawić okno WPF, aby nie miało przycisku zamykania? Nadal chciałbym, WindowState
żeby miał normalny pasek tytułu.
Znalazłem ResizeMode
, WindowState
i WindowStyle
, ale żadna z tych właściwości pozwala mi ukryć zamykacz ale pokazać pasek tytułu, jak w modalnych okien dialogowych.
Odpowiedzi:
WPF nie ma wbudowanej właściwości do ukrywania przycisku Zamknij pasek tytułu, ale możesz to zrobić za pomocą kilku linii P / Invoke.
Najpierw dodaj te deklaracje do swojej klasy Window:
Następnie wstaw ten kod do
Loaded
zdarzenia okna :I proszę bardzo: nie ma już przycisku Zamknij. Po lewej stronie paska tytułu nie będzie też ikony okna, co oznacza brak menu systemowego, nawet po kliknięciu paska tytułu prawym przyciskiem myszy - wszystkie one pasują do siebie.
Zauważ, że Alt+ F4nadal zamyka okno. Jeśli nie chcesz zezwalać na zamknięcie okna przed zakończeniem wątku w tle, możesz również zastąpić
OnClosing
i ustawić wartośćCancel
true, zgodnie z sugestią Gabe.źródło
SetWindowLongPtr
zamiast tego.Właśnie miałem podobny problem i rozwiązanie Joe White'a wydaje mi się proste i czyste. Użyłem go ponownie i zdefiniowałem jako załączoną właściwość Window
Następnie w XAML po prostu ustaw to w następujący sposób:
źródło
Ustaw
WindowStyle
właściwość na None, która ukryje pole kontrolne wraz z paskiem tytułowym. Nie ma potrzeby wywoływania jądra.źródło
this.DragMove();
doMouseDown
zdarzenia oknaTo nie pozbędzie się przycisku zamykania, ale powstrzyma kogoś przed zamknięciem okna.
Umieść to w swoim kodzie za plikiem:
źródło
Window
oknie dialogowym modalnym zakłóciWindow
ustawienie jegoDialogResult
właściwości i może spowodować, że nie będzie można jej użyć. stackoverflow.com/questions/898708/cant-set-dialogresult-in-wpfAby wyłączyć przycisk zamykania, należy dodać następujący kod do klasy Window (kod został pobrany stąd , nieco zmodyfikowany i ponownie sformatowany):
Ten kod wyłącza również zamknięcie elementu w menu System i uniemożliwia zamknięcie okna dialogowego za pomocą Alt + F4.
Prawdopodobnie będziesz chciał programowo zamknąć okno. Samo dzwonienie
Close()
nie zadziała. Zrób coś takiego:źródło
Próbowałem odpowiedzi Viachaslau, ponieważ podoba mi się pomysł, aby nie usuwać przycisku, ale go wyłączać, ale z jakiegoś powodu nie zawsze działało: przycisk zamykania był nadal włączony, ale bez żadnych błędów.
To z drugiej strony zawsze działało (pominięto sprawdzanie błędów):
źródło
Window
metodę rozszerzenia w moim projekcie.Właściwość do ustawienia to =>
WindowStyle="None"
źródło
Właśnie dodałem swoją implementację odpowiedzi Joe White'a przy użyciu zachowania interaktywnego (musisz odwołać się do System.Windows.Interactivity).
kod:
stosowanie:
źródło
Pozwól użytkownikowi „zamknąć” okno, ale tak naprawdę po prostu je ukryć.
W zdarzeniu OnClosing okna ukryj okno, jeśli jest już widoczne:
Za każdym razem, gdy wątek w tle ma zostać wykonany, ponownie wyświetl okno interfejsu użytkownika tła:
Po zakończeniu wykonywania programu upewnij się, że wszystkie okna są / mogą być zamknięte:
źródło
Tak więc w zasadzie jest twój problem. Przycisk zamykania w prawym górnym rogu ramki okna nie jest częścią okna WPF, ale należy do części ramy okna kontrolowanej przez system operacyjny. Oznacza to, że będziesz musiał to zrobić przy pomocy Win32 Interop.
alternatywnie możesz użyć ramki noframe i albo podać własną „ramkę”, albo nie mieć żadnej ramki.
źródło
Poniższe informacje dotyczą wyłączania przycisków zamykania i maksymalizacji / minimalizacji, a nie rzeczywistości usuwają przycisków (ale usuwają elementy menu!). Przyciski na pasku tytułu są rysowane w stanie wyłączonym / szarym. (Nie jestem do końca gotowy do przejęcia całej funkcjonalności ^ ^)
Różni się to nieco od rozwiązania Virgoss, ponieważ usuwa elementy menu (i separator końcowy, jeśli to konieczne), a nie tylko je wyłącza. Różni się od rozwiązania Joe Whitesa, ponieważ nie wyłącza całego menu systemowego, więc w moim przypadku mogę trzymać się przycisku i ikony Minimalizuj.
Poniższy kod obsługuje również wyłączanie przycisków Maksymalizuj / Minimalizuj, ponieważ w przeciwieństwie do przycisku Zamknij, usuwanie wpisów z menu nie powoduje, że system renderuje przyciski jako „wyłączone”, nawet jeśli usunięcie pozycji menu powoduje wyłączenie funkcji przycisków.
Mi to pasuje. YMMV.
Sposób użycia: Należy to zrobić PO zainicjowaniu źródła. Dobrym miejscem jest użycie zdarzenia SourceInitialized okna:
Aby wyłączyć funkcjonalność Alt + F4, łatwą metodą jest po prostu załączyć zdarzenie Anulowanie i użyć ustawienia flagi, gdy naprawdę chcesz zamknąć okno.
źródło
Kod XAML
powinno działać
Edytuj - na twoją chwilę ten Wątek pokazuje, jak to zrobić, ale nie sądzę, że Window ma właściwość, aby uzyskać to, czego chcesz, bez utraty normalnego paska tytułu.
Edit 2 Ten wątek pokazuje sposób na to, aby to zrobić, ale trzeba zastosować własny styl do menu systemowego i pokazuje sposób, jak można to zrobić.
źródło
Spróbuj dodać zdarzenie Zamykanie do okna. Dodaj ten kod do procedury obsługi zdarzeń.
Zapobiegnie to zamknięciu okna. Ma to taki sam efekt, jak ukrywanie przycisku zamykania.
źródło
Użyj tego, zmodyfikowanego z https://stephenhaunts.com/2014/09/25/remove-the-close-button-from-a-wpf-window :
źródło
Nie ukrywa to przycisku, ale uniemożliwi użytkownikowi przejście do przodu przez zamknięcie okna.
źródło
zestaw właściwości okna goto
nie dostaniesz blisko przycisków ...
źródło
WindowStyle = "None"
- uważaj na swoją składnię. Po drugie, jest to podejście strzelbowe, które usuwa pasek tytułowy, czyniąc pudełko brzydkim i pozbawionym tytułu, gdy istnieje o wiele wiele lepszych sposobów radzenia sobie z tym (o czym świadczą inne odpowiedzi), i jest duplikatem odpowiedzi.Jak stwierdzono w innych odpowiedziach, możesz
WindowStyle="None"
całkowicie usunąć pasek tytułu.I, jak stwierdzono w komentarzach do tych innych odpowiedzi, uniemożliwia to przeciąganie okna, więc trudno jest go przenieść z początkowej pozycji.
Można jednak temu zaradzić, dodając jeden wiersz kodu do Konstruktora w pliku Code Behind w oknie:
Lub, jeśli wolisz składnię Lambda:
Dzięki temu całe okno można przeciągać. Wszelkie interaktywne elementy sterujące obecne w oknie, takie jak Przyciski, będą nadal działać normalnie i nie będą działać jako uchwyty przeciągania dla okna.
źródło
Po wielu poszukiwaniach odpowiedzi na to pytanie opracowałem to proste rozwiązanie, które podzielę się tutaj w nadziei, że pomoże innym.
Ustawiłem
WindowStyle=0x10000000
.Ustawia to wartości
WS_VISIBLE (0x10000000)
iWS_OVERLAPPED (0x0)
Styl okna. „Nakładające się” to wartość niezbędna do wyświetlenia paska tytułu i obramowania okna. Przez usunięcieWS_MINIMIZEBOX (0x20000)
,WS_MAXIMIZEBOX (0x10000)
, orazWS_SYSMENU (0x80000)
wartości z wartością mojego stylu, wszystkie przyciski z paska tytułowego zostały usunięte, w tym przycisk Zamknij.źródło
WindowStyle
jest wyliczenie, którego wartości nie są zgodne ze stałymi interfejsami API systemu Windows; wymuszanie wartości doWindowStyle
wyliczenia nie będzie działać. Dla pewności sprawdziłem kod źródłowy .NET w ILSpy; wartość wyliczana jest tłumaczona na Windows API w funkcji prywatnejCreateWindowStyle
, a jeśli funkcja napotka nieznanąWindowStyle
wartość, po prostu ma zastosowanieWindowStyle.None
. (Jedynym sposobem byłoby użycie właściwości wewnętrznych_Style
i_StyleEx
odbicia, których zdecydowanie odradzam.)Użyj
WindowStyle="SingleBorderWindow"
, to ukryje przycisk maks. I min. W oknie WPF.źródło
close
przyciskuJeśli jest to tylko po to, aby zabronić użytkownikowi zamknięcia okna, jest to proste rozwiązanie.
Kod XAML:
IsCloseButtonEnabled="False"
źródło