Jak stylizować ramkę i pasek tytułu okna w WPF?

Tworzymy aplikację WPF, która wykorzystuje pakiet kontrolek Telerik i wszystko działa i wygląda dobrze. Niestety, ostatnio musieliśmy wymienić klasę bazową wszystkich naszych okien dialogowych, zmieniając RadWindow na standardowe okno WPF (powód nie ma znaczenia w tej dyskusji). W ten sposób otrzymaliśmy aplikację, która nadal wyglądała ładnie na wszystkich komputerach deweloperów (Windows 7 z włączonym Aero), ale była brzydka, gdy była używana w środowisku naszego klienta (usługi terminalowe pod Windows Server 2008 R2).

Radwindow Telerika jest standardową kontrolą Użytkownika, która naśladuje zachowanie okna dialogowego, więc stylizacja nie była problemem. Z oknem WPF trudno mi jednak zmienić jego "obramowanie". Co mam na myśli przez" obramowanie " tutaj jest zarówno pasek tytułu z ikoną i 3 standardowe przyciski (Minimalizuj, Maksymalizuj/przywracaj, Zamknij) i uchwyt zmiany rozmiaru wokół okna.

Jak mogę zmienić wygląd tych elementów:

  • Kolor paska tytułu
  • 3 standard buttons
  • rzeczywisty kolor obramowania okna

Z zaokrąglonymi rogami, jeśli to możliwe.

Author: Marcel Gosselin, 2012-04-02

6 answers

Są to obszary "non-client" i są kontrolowane przez Windows. Oto dokumenty MSDN na ten temat (odpowiednie informacje są na górze).

Zasadniczo ustawiasz WindowStyle="None", a następnie budujesz własny interfejs okna. (podobne pytanie na SO )

 25
Author: Muad'Dib,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:28

Musisz ustawić

WindowStyle="None", AllowsTransparency="True" oraz opcjonalnie ResizeMode="NoResize"
następnie ustaw właściwość Style okna na własny styl okna, w którym zaprojektujesz wygląd okna (pasek tytułu, przyciski, obramowanie) na cokolwiek chcesz i wyświetl zawartość okna w ContentPresenter.

Ten wydaje się być dobrym artykułem na temat tego, jak można to osiągnąć, ale istnieje wiele innych artykułów w Internecie.

 12
Author: Lescai Ionel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-14 14:56:44

Znalazłem bardziej proste rozwiązanie z @ DK komentarz w to pytanie, rozwiązanie napisał Alex i opisane tutaj ze źródłem, Aby zrobić okno niestandardowe:

  1. Pobierz przykładowy projekt tutaj
  2. edytuj generyk.plik xaml do dostosowania układu.
  3. Enjoy :).
 5
Author: Anas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:28

Sprawdź poniższą próbkę WPF dostosowując wygląd okna w XAML

Ta próbka pokazuje, jak w pełni dostosować styl / wygląd okna, w tym obszary spoza klienta: pasek tytułu, obramowania, przyciski max, min i zamknij, zapewniając jednocześnie wszystkie oczekiwane funkcje.

 3
Author: Abou-Emish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-13 11:46:06

Proponuję zacząć od rozwiązania podstawowego i dostosować je do swoich potrzeb, to lepiej niż zacząć od zera!

Szukałem tego samego i wpadłem na to rozwiązanie open source, mam nadzieję, że pomoże.

 1
Author: Belahcene Benzara Tahar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-30 13:32:37

Jeśli ktoś mówi ci, że nie możesz, bo to byłaby Strefa non-client i tylko Windows może to kontrolować, to się myli!

To jest tylko półprawda, ponieważ Windows pozwala określić rozmiary w obszarze innym niż klient. Faktem jest tylko to, że jest to możliwe w metodach jądra systemu Windows, a Ty jesteś w. NET, a nie w C++. W każdym razie, nie martw się! P / Invoke jest tylko po coś takiego! Możesz więc wywołać metody jądra, aby skonfigurować obszar inny niż klient.

Jednak to to naprawdę skomplikowane rozwiązanie, na które wpadłem wiele razy temu. Na szczęście, począwszy od. NET 4.5, możesz użyć klasy WindowChrome, aby skonfigurować obszar inny niż klient, jak chcesz. Tutaj możesz dostać się do MSDN.

W celu uproszczenia i uproszczenia, przekieruję cię tutaj , przewodnik, aby zmienić rozmiar obramowania okna na to, co chcesz. Ustawiając go na 0, będziesz mógł zaimplementować niestandardową obramowanie okna zamiast systemu.

Przepraszam, że nie zamieściłem wyraźnego przykład, ale później na pewno.

 0
Author: Davide Cannizzo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-26 14:35:04