Entwickler-Ecke

WPF / Silverlight - WPF Fenster - Farbe und Schriftart verändern


Kirk1701A - Fr 03.11.17 15:02
Titel: WPF Fenster - Farbe und Schriftart verändern
Hi Leute,

ich bin an einem ganz brand neuem WPF-Projekt und möchte meinen Fensterrahmen, das Fenster an sich und die Schriftart ändern. Wie geht das. Ich habe schon eine Seite gefunden, wo das beschrieben wird, aber das funktioniert bei mir nicht. Ich habe es erstmal bei einem leeren Fenster versucht, hat nicht geklappt. :?:

Ich brauche das dringend, denn ich bin schon 2,5 Tage mit dem Projekt hinterher. Das ist viel bei mir im Unternehmen. Sehr viel.

Euer Kirk


doublecross - Fr 03.11.17 15:43

Hallo,

was genau hast du denn versucht?
Willst du die Eigenschaften nur für ein bestimmtes Formular ändern, oder für alle in deiner Anwendung?
Worin genau sollen diese Änderungen bestehen?

So allgemein kann ich dir nur sagen, dass deine Recherchen wahrscheinlich in Richtung Suche bei Google WPF CONTROL TEMPLATE gehen sollten. Da findet man dann auch Beispiele [https://code.msdn.microsoft.com/windowsdesktop/WPF-styling-a-Window-in-fcf4e4ce] zur Veränderung der Formulareigenschaften.


Kirk1701A - Fr 03.11.17 15:55

Hi Leute,

ich wollte mein Fenster Schwarz machen. Also oben die Leistr und der Rahmen. Und der Text soll in der Leiste auch in einer anderen Schriftart geschrieben werden.


Palladin007 - Fr 03.11.17 16:07

Zitat:
Ich habe es erstmal bei einem leeren Fenster versucht, hat nicht geklappt.


Was hast Du denn versucht?
Am besten Du postest den Link, wo Du die Erklärung her hast.
Und zusätzlich ist's hilfreich, den Code dazu zu sehen.


Ralf Jansen - Fr 03.11.17 16:15

Die WPF UI ist der Inhalt in einem Windows/Fenster. Das Fenster selbst ist Teil vom OS und wird von diesem gestyled. Anders ausgedrückt es gibt kein WPF Fenster und es ist auch nicht dein Fenster ;)
Es gibt nur ein Windows Fenster das nicht den Regeln von WPF unterliegt sondern dennen von Windows. Damit zum OS gehört und eben nicht zu deinem Programm.

Der Klassiker wäre den Rahmen des Fensters auszublenden und dann eben den gewünschten Rahmen mit entsprechendem Look und allen notwendigen Funktionen nachzuprogrammieren. Wie das geht zeigt unter anderem der Link von doublecross.


Palladin007 - Fr 03.11.17 17:46

Dazu werf ich mal MahApps [http://mahapps.com/] in den Raum.
Das ist ein Controls-Paket für WPF, was auch ein eigenes Window-Control mit liefert.
Dieses MahApps-Window lässt sich ganz gut stylen.

Die machen das vermutlich genau so, wie Ralf sagt:
Rahmen ausblenden und einen Eigenen bauen.


Kirk1701A - Mo 06.11.17 11:25

Hi Leute;

@Ralf Jansen:
Kannst du mir erklären, wie man einen Fensterrahmen entfernt? Habe noch nie davon gehört... :gruebel: :gruebel:

@Palladin007:
Ich darf in meinem Unternehmen nicht einfach so was herunterladen. Ich muss das einreichen und etwa 'ne Woche auf die Genehmigung warten. Aber Danke :-)


Euer Kirk


Palladin007 - Mo 06.11.17 12:53

Schau dir mal diese beiden Window-Properties an:
Window.WindowStyle [https://msdn.microsoft.com/de-de/library/system.windows.window.windowstyle(v=vs.110).aspx]
Window.ResizeMode [https://msdn.microsoft.com/de-de/library/system.windows.window.resizemode(v=vs.110).aspx]


Und Du darfst das nicht downloaden, obwohl es kostenlos ist?
Nagut, dann musst Du dir das wohl Zuhause anschauen :P
Wenn Du das Projekt gar nicht anschauen darfst, kannst Du dir ja auch anschauen, wie die das gelöst haben.
Oder Du bastelst dir Zuhause eine Window-Anpassung (oder kopierst aus dem MahApps-Projekt) und schickst dir die relevanten Code-Zeilen per Mail.
Nicht schön, aber so kannst Du die Download-Begrenzung umgehen ^^


Kirk1701A - Mo 06.11.17 16:24

Hi Leute,

ich bin mit diesen zwei "Sachen" schon vertraut. Das eigentliche Ziel von mir ist, wie man die Farbe ändern kann. Nun, jmd. hat gesagt, dass man den Rahmen entfernen muss und einen selber Zeichnen und einsetzen muss. Wie geht das entfernen und zeichnen eines Windows-Rahmens?

Euer Kirk


Th69 - Mo 06.11.17 16:57

Dafür mußt du tief in die WinAPI-Trickkiste greifen, s. z.B. [Artikel] Custom Window Border für Form's [https://www.mycsharp.de/wbb2/thread.php?threadid=27473] (für WPF mußt du dann selbstverständlich Window statt Form verwenden etc.).


Kirk1701A - Mo 06.11.17 16:58

Das klingt unglaublich kompliziert. Na mal sehen, ich werd das mal versuchen. Wie sagt ein Berliner-Sprichwort?: "Mit Jeduld und Spucke, krickste jede Mucke!"


Palladin007 - Mo 06.11.17 18:18

Zitat:
ich bin mit diesen zwei "Sachen" schon vertraut. Das eigentliche Ziel von mir ist, wie man die Farbe ändern kann. Nun, jmd. hat gesagt, dass man den Rahmen entfernen muss und einen selber Zeichnen und einsetzen muss. Wie geht das entfernen und zeichnen eines Windows-Rahmens?


Was meinst Du, wozu ich dir beiden Properties verlinkt habe?
Damit blendest Du den Window-Rahmen aus...

Alles Weitere musst Du per Hand basteln, z.B. mit einem ganz normalen Control.

Beispiel:


XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
<Window.Style>
    <Style TargetType="Window">
        <Setter Property="ResizeMode" Value="CanResize" />
        <Setter Property="WindowStyle" Value="None" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Window">
                    <DockPanel>
                        <!-- Die eigentliche Title-Bar -->
                        <Grid DockPanel.Dock="Top" Background="Green">
                            <DockPanel Margin="10,5" LastChildFill="False">

                                <!-- Der Part links: Icon, Title, ContextMenu -->
                                <StackPanel DockPanel.Dock="Left">
                                    <StackPanel.ContextMenu>
                                        <ContextMenu>
                                            <MenuItem Header="Minimieren" />
                                            <MenuItem Header="Maximieren" />
                                            <Separator />
                                            <MenuItem Header="Schließen" />
                                        </ContextMenu>
                                    </StackPanel.ContextMenu>

                                    <Image Source="{TemplateBinding Icon}" />
                                    <TextBlock Text="{TemplateBinding Title}" />
                                </StackPanel>

                                <!-- Der Part rechts: -->
                                <!-- Minimize, Maximize und Close-Buttons -->
                                <UniformGrid DockPanel.Dock="Right" Columns="3">
                                    <Button Content="_" Padding="5,0" />
                                    <Button Content="□" Padding="5,0" Margin="2,0" />
                                    <Button Content="X" Padding="5,0" />
                                </UniformGrid>

                                <!-- Separator -->
                                <Grid DockPanel.Dock="Right" Background="DarkGray" Width="0.5" Margin="5,0" />

                                <!-- Zusätzliche Buttons, wenn gewollt -->
                                <ItemsControl DockPanel.Dock="Right">
                                    <ItemsControl.Items>
                                        <system:String>Button 1</system:String>
                                        <system:String>Button 2</system:String>
                                        <system:String>Button 3</system:String>
                                    </ItemsControl.Items>
                                    <ItemsControl.ItemsPanel>
                                        <ItemsPanelTemplate>
                                            <StackPanel Orientation="Horizontal" />
                                        </ItemsPanelTemplate>
                                    </ItemsControl.ItemsPanel>
                                    <ItemsControl.ItemTemplate>
                                        <DataTemplate>
                                            <Button Content="{Binding}" Margin="5,0,0,0" />
                                        </DataTemplate>
                                    </ItemsControl.ItemTemplate>
                                </ItemsControl>

                                <!-- Text neben den zusätzlichen Buttons -->
                                <TextBlock DockPanel.Dock="Right" Text="Viele coole Buttons: " />
                            </DockPanel>
                        </Grid>

                        <!-- Der eigentliche Inhalt -->
                        <Grid>
                            <ContentPresenter />
                        </Grid>
                    </DockPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Style>


Bindings (besonders der Buttons) musst Du noch selber bauen.
Pass aber beim ContextMenu auf, das liegt nicht im selben VisualTree wie das Window und macht da gerne Probleme.
Ein BindingProxy kann da aber Abhilfe schaffen.

Und Du musst sowas wie das Verschieben vom

Ach ja:
Du solltest dir noch die Trigger aus dem DefaultTemplate klauen.
Das DefaultTemplate bekommst Du so:
https://stackoverflow.com/questions/8825030/how-to-extract-default-control-template-in-visual-studio

Aber ich denke, am einfachsten ist es, wenn Du den Code von MahApps klaust und das raus wirfst, was Du nicht brauchst.
Außer Du hast Lust, mit der WinApi zu spielen ;)
Je nachdem, wie fitt Du damit bist, halte ich das aber für keine gute Idee. Ich hab die Windows-TitleBar bisher noch nicht verändert, aber ich weiß aus eigener Erfahrung, dass man bei der Arbeit mit der WinApi schnell mal viele Stunden versenken kann und am Ende nichts erreicht hat - besonders wenn man sich nicht gut auskennt und das tun wenige.