Frage

Also ich eine Anwendung am Bau, die viele Fenster, die alle mit dem gleichen grundlegenden Layout haben:

  1. Ein Hauptfenster
  2. Ein Logo in der oberen Ecke
  3. Ein Titelblock
  4. Ein Status displayer unten unten
  5. Ein Bereich für Fenster spezifische Kontrollen.

Im Moment muss ich in jedem Fenster mit dieser Struktur neu zu erstellen. Im Idealfall möchte ich dieses Layout in einem einzigen Ort kodiert werden, vielleicht in eine benutzerdefinierten Fenster Unterklasse für einfache Bedienung. Hat jemand irgendwelche Hinweise hat, wie zu beginnen, oder die bisherigen Erfahrungen mit ähnlichen Problemen?

War es hilfreich?

Lösung

Sie können eine neue Control schaffen, die ein Fenster darunter wie abgebildet zu erreichen Ziele.

<ControlTemplate x:Key="WindowControlTemplate1" TargetType="{x:Type Window}">
    <Border 
        Background="{TemplateBinding Background}" 
        BorderBrush="{TemplateBinding BorderBrush}" 
        BorderThickness="{TemplateBinding BorderThickness}"
        >
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="0.93*"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>

            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="0.21*"/>
                <ColumnDefinition Width="0.79*"/>
            </Grid.ColumnDefinitions>

            <ContentPresenter 
                Grid.ColumnSpan="2" 
                Grid.Row="1" 
                Content="{TemplateBinding Content}" 
                ContentTemplate="{TemplateBinding ContentTemplate}"
                />
            <ResizeGrip 
                HorizontalAlignment="Right" 
                x:Name="WindowResizeGrip" 
                VerticalAlignment="Bottom" 
                IsTabStop="False" 
                Visibility="Collapsed" 
                Grid.Column="1" 
                Grid.Row="2"
                />
            <TextBlock Text="My Logo" />
            <TextBlock Grid.Column="1" Text="My Title"/>
            <StatusBar Height="20" Grid.ColumnSpan="2" Grid.Row="2"/>
        </Grid>
    </Border>

    <ControlTemplate.Triggers>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="ResizeMode" Value="CanResizeWithGrip"/>
                <Condition Property="WindowState" Value="Normal"/>
            </MultiTrigger.Conditions>
            <Setter Property="Visibility" TargetName="WindowResizeGrip" Value="Visible"/>
        </MultiTrigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

Andere Tipps

Wenn Sie mutig genug sind, um eine große architektonische Verschiebung nehmen Sie CompositeWPF in Erwägung ziehen könnte (bisher Prism Codenamen ) aus dem Patterns & Practices Jungen bei Microsoft.

Von Interesse für Dich wäre die Fähigkeit, „Regionen“ in einer Shell (das heißt Fenster) zu definieren und dann Ansichten mit den Regionen zu füllen. Es verwendet das Model-View-Presenter Muster unabhängige Entwicklung von „Ansichten“ aus dem Modell zu erlauben, als einfach im Laufe der Zeit verschoben werden, da die Schale nur Regionen definiert und gekoppelt ist, nicht direkt zu dem, was in ihm platziert ist. Grundsätzlich hilft dies die Schale aus den Ansichten zu entkoppeln und die Ansichten voneinander und erleichtern die Unit-Test ... bla, bla, bla.

Es ist ein großer Sprung und etwas, das Sie verlangsamt zu beginnen, obwohl Ihre Situation eine der Arten von Anwendungen, die CompositeWPF gemeint ist, zu adressieren.

Im Rahmen der CompositeWPF Sie müssen an Bord verschiedene Muster nehmen, die Neulinge verwirren können, beispielsweise Die UnityContainer, Inversion of Control, MVP (oder Modell / view / view-Modell) und die Abhängigkeit der Injektion.

kann ich erinnere mich, als ich zum ersten Mal mit den Beispielanwendungen sind verwirrt begonnen, weil es nicht klar ist, wie auf der Erde die einige der Ansichten selbst erstellt werden wurden! Die Einheit Behälter werden Objekte instanziiert und parametrisierte Konstruktoren magisch nennen.

CompositeWPF ist eine elegante Lösung für Ihre Frage, aber keine einfache oder einfach ein. CompositeWPF in meinem letzten Projekt verwendet Nachdem ich die Absicht, es für die nächste entsprechende Anwendung wieder zu verwenden.

Der einfachste Ansatz ist WPF eine „Seite“ für die Fenster spezifischen Kontrollen zu schaffen und einen „Frame“ im Hauptfenster zu platzieren. Sie können sogar eine schöne Navigation auf diese Weise erstellen.

, warum genau sind Sie mit „viele Fenster?“ Warum nicht nur ein einzelnes Fenster mit einem Register-Steuerelement? Oder ein einzelnes Fenster mit Benutzersteuer?

Egal, Ihre Frage zu beantworten, Benutzersteuerelemente sind eine Möglichkeit, Sie die Funktionalität erhalten möchten, die Sie beschreiben, wie wollen.

Erstellen

eine neue Fensterklasse, und haben sie eine „Childrens“ Eigenschaft haben, die ermöglicht ein Objekt in das Dock-Panel eingebettet werden, wo Sie die „Fenster spezifische Kontrollen“ gehen wollen.

Wenn Sie neue Fenster starten, instanziiert den Fenstertyp, und eine Benutzersteuerung mit den spezifischen Kontrollen, fügen Sie den Benutzer die Steuerung an die Kinder Eigentum Ihrer Fenster, und dann das Fenster anzuzeigen. Sie können auch Event-Handler, Datacontexts und was zu diesem Zeitpunkt nicht binden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top