Domanda

Quindi sto costruendo un'applicazione che avrà molte finestre, tutte con lo stesso layout di base:

  1. Una finestra principale
  2. Un logo nell'angolo in alto
  3. Un cartiglio
  4. Un indicatore di stato in basso
  5. Un'area per i controlli specifici della finestra.

Al momento devo ricreare questa struttura in ogni finestra. Idealmente, voglio che questo layout sia codificato in un unico posto, magari in una sottoclasse Window personalizzata per facilità d'uso. Qualcuno ha qualche indizio su come iniziare o esperienza precedente con problemi simili?

È stato utile?

Soluzione

Puoi creare un nuovo ControlTemplate che abbia come obiettivo una finestra per farlo come mostrato di seguito.

<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>

Altri suggerimenti

Se sei abbastanza coraggioso da fare un grande cambiamento architettonico, potresti prendere in considerazione CompositeWPF (precedentemente denominato in codice Prism ) da Patterns & amp; Pratica ragazzi in Microsoft.

Di tuo interesse sarebbe la capacità di definire "regioni" in una shell (cioè finestra) e quindi usando le viste per riempire le regioni. Utilizza il modello Model-View-Presenter per consentire lo sviluppo indipendente di "viste" dal modello che può essere facilmente trasferito nel tempo poiché la shell definisce solo le regioni e non è accoppiata direttamente a ciò che vi è inserito. Principalmente questo aiuta a disaccoppiare il guscio dalle viste e le viste l'una dall'altra e rende più semplice il test unitario ... blah, blah blah.

È un grande salto e qualcosa che ti rallenterà all'inizio, anche se la tua situazione è uno dei tipi di applicazioni che CompositeWPF dovrebbe affrontare.

Come parte di CompositeWPF dovrai prendere in considerazione vari schemi che possono confondere i nuovi arrivati, ad es. UnityContainer, inversione di controllo, MVP (o modello / vista / vista-modello) e iniezione di dipendenza.

Ricordo quando ho iniziato per la prima volta con le app di esempio perplesse perché non è ovvio come mai alcune viste fossero state create! Il container di unità creerà istanze di oggetti e chiamerà magicamente costruttori parametrizzati.

CompositeWPF è una soluzione elegante alla tua domanda ma non semplice o diretta. Avendo utilizzato CompositeWPF nel mio ultimo progetto, intendo utilizzarlo nuovamente per la successiva applicazione appropriata.

L'approccio più semplice è quello di creare WPF una pagina " per i controlli specifici della finestra e posizionare un " Frame " nella finestra principale. Puoi persino creare una buona navigazione in questo modo.

perché stai usando esattamente " molte finestre? " Perché non solo una singola finestra con un controllo a schede? O un'unica finestra con i controlli utente?

Indipendentemente da ciò, per rispondere alla tua domanda, i controlli utente sono un modo in cui vuoi ottenere la funzionalità che stai descrivendo come desiderabile.

Crea una nuova classe Window e disponi di un " Childrens " proprietà che consente a un oggetto di essere incorporato nel pannello del dock in cui si desidera i controlli specifici "finestra" per andare.

Quando avvii nuove finestre, crea un'istanza del tipo di finestra e un controllo utente con i controlli specifici, aggiungi il controllo utente alla proprietà Children della tua finestra, quindi mostra la finestra. Puoi persino collegare gestori di eventi, DataContexts e cosa no in questo momento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top