2011-01-07 10 views
11

Pracuję z VS2010 w języku C# i chcę utworzyć okno WPF, które ma tekst paska zadań inny niż tytuł okna. Właściwość Tytuł ustawia zarówno tytuł okna, jak i tekst paska zadań. Czy istnieje sposób na ich oddzielne ustawienie?Ustaw tekst paska zadań inny niż tytuł okna w wpf

+2

Oczywiście ustawia oba z nich.Jak często widzisz aplikację, której paski tytułu okna i elementy paska zadań mają różne napisy? Jak byś wiedział, do którego okna odpowiada element paska zadań? –

+0

Powodem jest to, że tytuł paska zadań jest obcięty, a więc może skończyć się tak samo dla kilku okien. Np. Jeśli okna to "Adres klienta - ABC Corporation" i "Adres klienta - ABCDEFG Inc", możesz otrzymać "Adres klienta - ABC" dla obu. Byłoby miło móc to zmienić na "Dodaj klienta". więc pokazuje ważna część. –

+0

... oczywiście zalecenie MSDN ma najpierw wyróżnić bit: "ABC Corporation - adres klienta" obcina się do czegoś w rodzaju "ABC Corporation - reklama klienta". Co ma sens w przypadku obcięcia, ale wygląda dziwnie w ten sposób w normalnym tytule okna. –

Odpowiedz

7

Po pierwsze, pozwól mi wzmocnić to, co powiedział Cody Grey w swojej odpowiedzi i komentarzu - jest to niestandardowe zachowanie i powinieneś mieć cholernie dobry powód, aby to zrobić.

Biorąc to pod uwagę, chciałbym przyjąć prawie przeciwne podejście do punktu Cody'ego # 1. Stworzyłem okno WindowStyle ustawione na None i ponownie utworzyłem pasek tytułu (który mógłby zawierać ikonę, twój "pseudo tytuł", zminimalizować, zmaksymalizować i zamknąć przyciski, a może nawet standardowe menu Windows. zmiana rozmiaru uchwytu (można to zrobić, ustawiając ResizeMode na CanResizeWithGrip, ale dodaje kontrolę Grip na dole okna, co sprawia, że ​​wygląda nieco inaczej niż "normalne" okno). będzie to tytuł, który chcesz pokazać na pasku zadań, a "pseudo tytuł" w pasku tytułu, który utworzysz, będzie etykietą lub blokiem tekstowym związanym z tym, co chcesz, aby twoje okno się wyświetlało. mały kompleks, ale naprawdę niezbyt trudny do zrobienia. Prawdopodobnie natkniesz się na Gotcha s po drodze (na przykład, w jaki sposób okno wygląda na różnych systemach operacyjnych lub z różnymi zastosowanymi motywami Windows). Fajną rzeczą jest to, że nie wymaga interopu, a większość z nich można osiągnąć tylko za pomocą XAML.

Istnieje wiele przykładów online (here is one wybranych losowo).

Ponownie, musisz zdecydować, czy warto dążyć do stworzenia niestandardowego zachowania. YMMV.

+1

Dzięki za odpowiedź, działa ona dobrze i jest łatwa do zrobienia. Pragnę zauważyć, że Microsoft wprowadza WPF Shell Integartion do niestandardowego chrome systemu Windows (http://code.msdn.microsoft.com/WPFShell). Jednak większość funkcji jest wykonywana tylko w systemie Windows 7. – Nicolas

+0

Dobry punkt na WPFShell. –

4

Zasadniczo masz dwie opcje:

  1. Draw the taskbar button yourself, zamiast pozwolić Okna go obsłużyć. Jest to właściwie dość proste, jeśli chodzi o rysowanie przez właściciela.

  2. Zarządzaj jednocześnie dwoma różnymi formularzami/oknami. Musisz utworzyć ukryte główne okno, które pojawi się na pasku zadań i będzie właścicielem drugiego okna. Twoje drugie okno będzie widoczne, wyświetli własny napis na pasku tytułu i będzie zawierało rzeczywisty interfejs użytkownika, ale nie pojawi się na pasku zadań (ustaw jego właściwość ShowInTaskbar na "False"). Będziesz musiał napisać kod, aby pokazać drugie okno, gdy pierwszy zostanie aktywowany za pomocą paska zadań.

Zalecam, aby przed rozpoczęciem jednej z tych ścieżek, dokładnie rozważyć, czy naprawdę potrzebujesz tej "funkcjonalności". Trudno powiedzieć, co się dzieje z tym, co masz, jeśli masz jedno okno z różnymi nazwami w różnych miejscach.

+0

Dzięki za odpowiedź. Drugi punkt wydaje się dość łatwy do zrobienia (podoba mi się ten pomysł), ale nie chcę mieć dwóch okien. O drugim punkcie, czy wiesz, jak to zrobić w wpf C#? Nie wiem, jak zastąpić metodę IsIconic i obawiam się, że w WPF nie ma obsługi okna. – Nicolas

+0

@Nicolas: Naprawdę nie mam swoich skrzydeł jako programisty WPF, ale klasy ['WindowInteropHelper'] (http://msdn.microsoft.com/en-us/library/system.windows.interop.windowinterophelper. aspx) umożliwia współdziałanie z niezarządzanym interfejsem API systemu Windows. W szczególności jego właściwość ['Handle'] (http://msdn.microsoft.com/en-us/library/system.windows.interop.windowinterophelper.handle.aspx) zwróci' hWnd' dla okna. Ryzyko z pierwszą sugestią jest takie, że może nie działać poprawnie w nowszych wersjach systemu Windows (takich jak 7), które zasadniczo zmieniły pasek zadań. Oczywiście nie testowałem tego. –

+2

@Nicolas Opcja 2 nie jest łatwa. @Cody ma rację, że musisz pokazać i ukryć drugie okno, gdy działasz na pasku zadań. Potrzebujesz także podglądu miniatur, które, jak podejrzewam, będą mostem za daleko. Aplikacje Delphi poprzednio korzystały z opcji 2, co pozwalało na odróżnianie podpisów paska zadań i głównego, ale gdy Vista wyszła, przestali to robić. Co więcej, był błąd po błędzie związany z głównym oknem, a fałszywe okno nie synchronizowało się poprawnie. Moją radą jest przetestować i zachować podpisy tak samo. –

1

spróbuje użyć tego: http://www.codeguru.com/forum/showthread.php?t=3833 w połączeniu z http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/6b97a6de-0480-4339-8ed0-cb7cdb27bd83

Pierwszy z nich działa dobrze dla mnie w klasycznej formie aplikacji .NET, kiedy dokonali okno bez paska tytułowego i chcesz jakiś tekst w pasku zadań ikonę . Po drugie, musisz obsługiwać komunikaty WIN32 o niskim poziomie w oknie WPF (ale działa to tylko dla najwyższego poziomu).

Powiązane problemy