Question

Je construis donc une application qui aura beaucoup de fenêtres, toutes avec le même agencement de base:

  1. Une fenêtre principale
  2. Un logo dans le coin supérieur
  3. Un cartouche
  4. Un afficheur d'état en bas
  5. Une zone pour les contrôles spécifiques à la fenêtre.

Pour le moment, je dois recréer cette structure dans chaque fenêtre. Idéalement, je souhaite que cette mise en page soit codée à un seul endroit, peut-être dans une sous-classe Window personnalisée pour en faciliter l'utilisation. Quelqu'un at-il des indices sur la façon de démarrer ou sur une expérience antérieure avec des problèmes similaires?

Était-ce utile?

La solution

Vous pouvez créer un nouveau ControlTemplate qui cible une fenêtre pour y parvenir, comme indiqué ci-dessous.

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

Autres conseils

Si vous êtes assez courageux pour opérer un grand changement d'architecture, vous pouvez envisager de CompositeWPF (précédemment appelé Prism). ) des modèles & amp; Pratique les gars chez Microsoft.

La possibilité de définir des "régions" vous intéresserait. dans un shell (c'est-à-dire une fenêtre), puis en utilisant des vues pour remplir les régions. Il utilise le modèle Model-View-Presenter pour permettre le développement indépendant de " vues " À partir du modèle, il peut facilement être déplacé dans le temps car l’enveloppe ne définit que des régions et n’est pas couplée directement à ce qui y est placé. Cela permet principalement de découpler le shell des vues et des vues les unes des autres et de faciliter les tests unitaires ... bla, bla bla.

C’est un grand saut et quelque chose qui va vous ralentir au début, bien que votre situation soit l’un des types d’applications que CompositeWPF est censé traiter.

Dans le cadre de CompositeWPF, vous devrez prendre en compte divers modèles pouvant induire en erreur les nouveaux arrivants, par exemple. UnityContainer, inversion de contrôle, MVP (ou modèle / vue / vue-modèle) et injection de dépendance.

Je me souviens de mes débuts avec les exemples d'applications intrigués, car il n'est pas évident de voir comment certaines vues ont même été créées! Le conteneur unit instanciera les objets et appellera comme par magie les constructeurs paramétrés.

CompositeWPF est une solution élégante à votre question mais pas simple ou simple. Ayant utilisé CompositeWPF dans mon dernier projet, j'ai l’intention de le réutiliser pour la prochaine application appropriée.

L’approche la plus simple consiste à créer un fichier WPF "page". pour les contrôles spécifiques à la fenêtre et placez un " Cadre " dans la fenêtre principale. Vous pouvez même créer une belle navigation de cette façon.

Pourquoi utilisez-vous exactement " beaucoup de fenêtres? " Pourquoi ne pas simplement une seule fenêtre avec un contrôle de tabulation? Ou une seule fenêtre avec des contrôles utilisateur?

Quoi qu'il en soit, pour répondre à votre question, les contrôles utilisateur sont l'un des moyens par lesquels vous souhaitez obtenir la fonctionnalité que vous décrivez comme manquante.

Créez une nouvelle classe Window et attribuez-lui un " Childrens " propriété qui permet à un objet d’être incorporé dans le panneau de dock où vous souhaitez que les "contrôles spécifiques à la fenêtre" " aller.

Lorsque vous lancez de nouvelles fenêtres, instanciez le type de fenêtre et un contrôle utilisateur avec les contrôles spécifiques, ajoutez le contrôle utilisateur à la propriété Enfants de votre fenêtre, puis affichez la fenêtre. Vous pouvez même attacher des gestionnaires d’événements, des DataContexts et autres encore.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top