Laden...

Eigenes Window in WPF bauen - Standardrahmen vermeiden

Erstellt von DeSharper vor 7 Jahren Letzter Beitrag vor 7 Jahren 3.923 Views
D
DeSharper Themenstarter:in
40 Beiträge seit 2016
vor 7 Jahren
Eigenes Window in WPF bauen - Standardrahmen vermeiden

Hallo zusammen,

ich versuche gerade mir eine eigenes Window zu bauen. Den Standart-Rahmen will ich nicht haben. Allerdings scheitere bereits mein einfachster Testaufbau. Offensichtlich habe ich da ein grundlegendes Verständnisproblem.

Im ersten Schritt sollte mein Template ein Fenster mit einer Titelleiste und Inhalt sein, wobei die Titelleiste mit dem Fenstertitel verknüpft sein soll und der Inhalt wird natürlich erst später im echten Fenster eingefügt. Allerdings klappt schon das testweise darstellen von hartcodierten Texten in Titel- und Contentzeile nicht.


    <ControlTemplate x:Key="DialogTemplate" TargetType="Window">
        <Border BorderBrush="{StaticResource SolidBorderBrush}" BorderThickness="3">
            <Border.Effect>
                <DropShadowEffect BlurRadius="10" ShadowDepth="5" Color="{StaticResource IntenseDark}"/>
            </Border.Effect>            
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="40"/>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>
                <Border Name="title" Grid.Row="0">
                    <TextBox Text="hier sollte der Fenstertitel stehen"></TextBox>
                </Border>
                <Grid Name="content" Grid.Row="1">
                    <TextBox Text="ich bin ein platzhalter für den fensterInhalt"></TextBox>
                </Grid>
            </Grid>
        </Border>
    </ControlTemplate>


    <Style x:Key="DialogStyle" TargetType="Window">
        <Setter Property="Background" Value="{StaticResource WindowBackgroundBrush}"/>
        <Setter Property="WindowStyle" Value="None"/>
        <Setter Property="ResizeMode" Value="NoResize"/>
        <Setter Property="Template" Value="{StaticResource DialogTemplate}"></Setter>
    </Style>

Was mich vollkommen verwirrt ist, dass es im Editor zur Entwurfszeit richtig angezeigt wird, aber zur Laufzeit sehe ich nichts davon, nichtmal den Rahmen.

Frage 1: Was mache ich falsch?
Frage 2: Wie bekomme ich am Ende die echten Childelemente des Fensters da rein?

W
955 Beiträge seit 2010
vor 7 Jahren

Frage 1: Was mache ich falsch? Du leidest am NIH-Syndrom. Nimm ne Lib wie Mahapps.Metro.

T
461 Beiträge seit 2013
vor 7 Jahren

Ist halt die Frage warum. Wenn dieses Projekt keine große Bedeutung hat und einfach nur hardcore lernen will (mit unzähligen Male auf die schnauze fliegen 😉 so wie ich auch öfters einer bin), dann hat es wenigstens einen Lerneffekt.

Eine Frage zum Thema, warum verwendest du nicht einfach das originale Window und modifizierst es so, daß du das selbe Ergebnis erreichst mit dem Rahmen usw... Ist um einiges einfacher..


<Window x:Class="Test.Window"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
              Height="345" Width="531" 
              WindowStyle="None" WindowStartupLocation="CenterScreen" 
              ResizeMode="NoResize" AllowsTransparency="True" >
</Window>

Ein kleiner uralter Ausschnitt von dem was ich mal geschaffen habe.
Alles Innerhalb des Windows wird dann ohne üblichen Rahmen angezeigt.
(hab es einfach so kopiert ohne Änderungen...)

Grüße

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

W
955 Beiträge seit 2010
vor 7 Jahren

Ja diese Lösung funktioniert halt nur solange bis du WinForm-Controls in dem Fenster hosten willst (z.B. ReportViewer) und dich dann wunderst warum dort nichts angezeigt wird. Nach Tagen zähen Suchens wirst du dann herausfinden dass der GDI-Renderer in Sachen Transparenz inkompatibel mit dem WPF-Renderer ist. Aber es ist natürlich dein Recht freiwillig auf die Schnauze zu fliegen.

D
DeSharper Themenstarter:in
40 Beiträge seit 2016
vor 7 Jahren

Ehrlich gesagt geht es mir hauptsächlich um den Lerneffekt. Deswegen würde ich das ganze auch gerne ohne externe Bibliothek lösen. Davon abgesehen sehe ich an der Stelle erstmal auch noch keinen Sinn in einer lib, ich will doch nur mein Fenster anpassen. Und gehen muss das ja irgendwie. Das normale Window verwende ich eben auch deswegen nicht, weil ich was lernen und ausprobieren will. Vielleicht soll mein window demnächst rund sein, oder was auch immer.
Mich wundert auch, dass ich dazu online keine Beispiele finde. Ich hätte gedacht, dass bei den Möglichkeiten, die wpf bietet Hinz und Kunz anfängt 17-eckige Fenster mit rotierenden Buttons zu erstellen.

4.942 Beiträge seit 2008
vor 7 Jahren

Also online gibt es genug Beispiele (einfach nach "wpf customize window title bar" suchen):
WPF customizing the appearance of a window in XAML
WPF customizable window
How to create a custom window in WPF

Mit WPF hat man zwar viele Möglichkeiten, aber das eigentliche Window kommt noch direkt aus der WinAPI (und daher mußt du die von ThomasE. gezeigten Eigenschaften setzen - um komplett alles selber zu zeichnen, s.a. How can I style the border and title bar of a window in WPF?).

D
DeSharper Themenstarter:in
40 Beiträge seit 2016
vor 7 Jahren

Ich habe gerade testhalbe das template komplett rausgenommen und nur den Fenster-Hintergrund auf Rot gesetzt. Auch das ist in der Entwurfsansicht sichtbar, hat aber keinerlei Auswirkungen auf das Fenster zur Laufzeit. Wie kann das sein???

Die Hintergrundfarbe, die ich zur Laufzeit sehe, sieht aber aus, als wäre sie auch von mir, ich hab nur keine Ahnung wo die herkommt. Ich bekomme es ja willentlich nicht hin, in dem Fenster irgendwelche Style-Werte zu setzen.

D
DeSharper Themenstarter:in
40 Beiträge seit 2016
vor 7 Jahren

Huch, Antwort jetzt erst gesehen, danke, ich werd mir das mal anschauen.