2009-02-19 5 views
5

Comment créer une apparence de fenêtre commune dans WPF? Je ne parle pas seulement de styliser la fenêtre, je veux dire d'avoir une fenêtre avec une bordure, une grille et d'autres choses.Création d'une apparence de fenêtre commune dans WPF

Merci.

+0

pouvez-vous expliquer un peu plus .. vous voulez une fenêtre avec un contenu prédéfini ... comme des pages maîtres en ASP? Ou suis-je sur la mauvaise piste? – Gishu

Répondre

0

Ce que j'ai fini par faire était de créer une classe de base qui a créé le code de l'interface utilisateur que je voulais dans chaque fenêtre. Cela me permet de définir des événements pour les contrôles et d'avoir l'abonnement à l'événement dans la classe de base. S'il y a une meilleure façon de faire cela, comme utiliser xaml, j'aimerais savoir.

public WindowBase() 
{ 
    Initialized += WindowBase_Initialized; 
} 

private void WindowBase_Initialized(object sender, EventArgs e) 
{ 
    Border border = new Border(); 
    border.SetResourceReference(Control.StyleProperty, "WindowBorder"); 

    border.Child = new ContentPresenter { Content = this.Content}; 

    this.Content = border; 
} 
5

Vous pouvez créer un ControlTemplate pour la fenêtre. Voici un exemple assez simple qui a quelques contrôles et déclencheurs. Vous pouvez facilement ajouter plus d'éléments pour l'adapter à vos besoins.

<ControlTemplate x:Key="MyWindowTemplate" TargetType="{x:Type Window}"> 
     <Border x:Name="WindowBorder" Style="{DynamicResource WindowBorderStyle}"> 
     <Grid> 
      <Border Margin="4,4,4,4" Padding="0,0,0,0" x:Name="MarginBorder"> 
       <AdornerDecorator> 
        <ContentPresenter/> 
       </AdornerDecorator> 
      </Border> 
      <ResizeGrip Visibility="Collapsed" IsTabStop="false" HorizontalAlignment="Right" x:Name="WindowResizeGrip" 
        VerticalAlignment="Bottom" /> 
     </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"/> 
      <Setter Property="Margin" TargetName="MarginBorder" Value="4,4,4,20" /> 
     </MultiTrigger> 
     <Trigger Property="WindowState" Value="Maximized"> 
      <Setter Property="CornerRadius" TargetName="WindowBorder" Value="0,0,0,0"/> 
     </Trigger> 
     </ControlTemplate.Triggers> 
    </ControlTemplate> 

Vous pouvez utiliser cette ControlTemplate en définissant la propriété de modèle de la fenêtre:

Template="{StaticResource MyWindowTemplate}" 

Vous voulez utiliser en conjonction avec un style comme celui-ci:

<Style x:Key="MyWindowStyle" TargetType="{x:Type Window}"> 
     <Setter Property="AllowsTransparency" Value="False" /> 
     <Setter Property="WindowStyle" Value="SingleBorderWindow" /> 
     <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}"/> 
     <Setter Property="Background" Value="Transparent" /> 
     <Setter Property="ShowInTaskbar" Value="False" /> 
     <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Window}"> 
       <Border> 
        <AdornerDecorator> 
        <ContentPresenter/> 
        </AdornerDecorator> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
     </Setter> 
    </Style> 

Et définir le style sur votre fenêtre comme ceci:

Style="{StaticResource MyWindowStyle}" 
+0

Cela fonctionne très bien. Le seul problème que j'ai maintenant est que j'ai quelques événements dans le code ControlTemplate. Si je veux que toutes les fenêtres utilisent le modèle, alors je dois mettre la ressource dans un fichier différent. Quand je fais cela, les événements ne fonctionnent plus. –