Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
BaseWindow mit 2 ContentPresenter
Coooder
myCSharp.de - Member



Dabei seit:
Beiträge: 186

Themenstarter:

BaseWindow mit 2 ContentPresenter

beantworten | zitieren | melden

Hallo Leute!

Ich möchte mir eine BaseWindow Klasse erstellen um eben alle Fenster der Anwendung davon ableiten zu lassen. Das Fenster soll in 2 Teile aufgeteilt werden. Oben ein Menü und unten der Content.
Überlegt hab ich mir, das mit 2 ContentPresenter im ControlTemplate umzusetzten.
Allerdings bin ich mir nich so sicher wie meine nächsten schirtte aussehen müssten dafür. Aus den google ergebnissen wurde ich nur teilweise schlau drauß.

Hier erstmal das was ich bereits habe:

Application Resources
<Style x:Key="MyWindow" TargetType="cl:BaseWindow">
            <Setter Property="WindowStyle" Value="None" />
            <Setter Property="ResizeMode" Value="CanResizeWithGrip" />
            <Setter Property="AllowsTransparency" Value="True" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Window">
                        <Border BorderBrush="DarkGray" BorderThickness="1" Background="White">
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*"/>
                                    <ColumnDefinition Width="*"/>
                                </Grid.ColumnDefinitions>

                                <ContentPresenter HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Column="0" />
                                <ContentPresenter HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Column="1" />

                            </Grid>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

Wie man sieht hab ich hier erstmal ganz Stumpf 2 Contentpresenter nebeneinander ...

MainWindow.xaml
<cl:BaseWindow x:Class="Client.MainWindow"
        xmlns:cl="clr-namespace:Client"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        Style="{DynamicResource MyWindow}">
    
    <Grid>
        
    </Grid>
    
</cl:BaseWindow>
Hier liegt das Grid im 2ten ContentPresenter...
BaseWindow selbst is noch Komplett leer und leitet nur vin Window im moment ab.

Ich bin mir nich ganz sicher ob ich für mein Vorhaben überhaupt eine BaseWindow brauche ... es "fühlt" sich aber so an =D

Kurz gefragt ... wie könnt ich jetzt weiter vorgehen damit ich 2 ContentPresenter nutzen kann?
Oder is der Ansatz ansich schon nich Empfehlenswert? Freue mich über eure Antworten.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Coooder am .
private Nachricht | Beiträge des Benutzers
ErfinderDesRades
myCSharp.de - Experte

Avatar #avatar-3151.jpg


Dabei seit:
Beiträge: 5409

beantworten | zitieren | melden

ich sehe noch keinen Gewinn darin.
Derzeit hast du ein Window ohne Inhalt, und einen Style mit Inhalt. Und dem Window ohne Inhalt gibst du den Style mit Inhalt, damit das Window ohne Inhalt dochn Inhalt hat.

Aber warum nicht gleich den Inhalt ins Window machen?

die ContentPresenter selbst sind flexibel genug um alle Arten von Controls und UserControls und DataTemplates anzuzeigen.
Der frühe Apfel fängt den Wurm.
private Nachricht | Beiträge des Benutzers
Coooder
myCSharp.de - Member



Dabei seit:
Beiträge: 186

Themenstarter:

beantworten | zitieren | melden

Der Inhalt des Windows kommt ja noch ...
Und der Style mit dem ControlTemplate is halt dafür, dass ich das nich in jedem Fenster neu machen muss.

Ich will mir also ein BaseWindow bauen das im prinziep so funktioniert/aussieht:

<cl:BaseWindow x:Class="Client.MainWindow"
        xmlns:cl="clr-namespace:Client"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        Style="{DynamicResource MyWindow}">

<NaviLeiste>
*Diverser Content*
</NaviLeiste>

<WindowContent>
*Diverser Content*
</WindowContent>

</cl:BaseWindow>

Is das so in etwa möglich?
private Nachricht | Beiträge des Benutzers
Rioma
myCSharp.de - Member



Dabei seit:
Beiträge: 228

beantworten | zitieren | melden

Ich verstehe dich so, dass die Navi-Leiste immer sichtbar ist und du je nach ausgewähltem Item aus deiner Navi-Leiste die Ansicht rechts neben deinem Menü anpassen möchtest.

Falls ja, sollte/könnte deine Navi-Leiste eine Liste von ViewModels haben. Per Datatemplate "erklärst" du der UI wie das selektierte ViewModel gerendert werden muss --> hier gibst du dein spezifisches UserControl an. Dein contentcontrol bindest du dann an das selektierte ViewModel aus deiner Navi-Leiste. Je nach ausgewähltem Item ändert sich nun die UI.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Rioma am .
private Nachricht | Beiträge des Benutzers
ErfinderDesRades
myCSharp.de - Experte

Avatar #avatar-3151.jpg


Dabei seit:
Beiträge: 5409

beantworten | zitieren | melden

Inhalt kann eiglich nicht mehr kommen, denn wenn dein Style ein Template zuweist, ist der Inhalt, der vorher da war, futsch.
Der frühe Apfel fängt den Wurm.
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10070

beantworten | zitieren | melden

Und bei Vererbung von Controls in WPF kann nur eine Ebene XAML benutzen.
private Nachricht | Beiträge des Benutzers
Coooder
myCSharp.de - Member



Dabei seit:
Beiträge: 186

Themenstarter:

beantworten | zitieren | melden

@Rioma genau so hab ich das vor, nur das ich das nich bei jedem Fenster der Anwendung immer wieder neu machen wollte ^^
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10070

beantworten | zitieren | melden

Naja, du müsstest auch nur ein solches Fenster machen und dadrin nur den Content austauschen.
private Nachricht | Beiträge des Benutzers
Coooder
myCSharp.de - Member



Dabei seit:
Beiträge: 186

Themenstarter:

beantworten | zitieren | melden

Ahhh Hirngrütze gestern abend gehabt sry ... Ich kann ja das Fenster sowieso schon wiederverwerten ^^

Danke euch
private Nachricht | Beiträge des Benutzers