2010-01-03 19 views
14

Je suis en train peroperty Marge et Rembourrage d'une fenêtre et il n'a pas:Window.Margin et Window.Padding ne prennent effet fonctionnent pas

Voici un exemple:

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    SizeToContent="WidthAndHeight" 
    ResizeMode="NoResize" 
    Padding="22" 
    Margin="22"> 

    <Grid> 
     <Label 
      FontWeight="Bold" 
      FontSize="36" 
      BorderThickness="1" 
      BorderBrush="Red" 
      Content="Hello world!"/> 
    </Grid> 
</Window> 

Résultat:
alt text

le résultat recherché est que le cadre rouge de l'étiquette doit être éloigné 44px à partir du cadre de la fenêtre (marge + padding). Oui, je sais que je peux définir la marge de l'étiquette, mais ce n'est pas ce que je veux. J'ai un projet entier que toutes ses fenêtres sont définies à un style, je veux définir ces propriétés (ou autre) dans le style de la fenêtre générale. Je suppose que si je ne trouve aucune solution, je vais créer un style nommé pour la cupidité où je vais définir la marge/padding, puis je vais aller fenêtre par fenêtre et définir le style de la grille, mais c'est la dernière option que je vouloir faire.
Merci d'avance.

Répondre

6

Il n'est pas surprenant que la marge ne fonctionne pas, parce que la marge est la quantité d'espace à placer autour de le contrôle. Pour une fenêtre, cela signifierait que le cadre soit plus petit (et décalé), et non la zone client, ce qui serait un peu étrange (et pourrait ne pas fonctionner correctement avec l'environnement d'hébergement Win32, pas sûr). Il est un peu surprenant que Padding ne fonctionne pas, et je ne sais pas pourquoi ce serait.

Cependant, il existe une solution que vous pouvez encapsuler dans un style: remplacer la fenêtre par défaut ControlTemplate avec votre propre modèle qui ne respecte la Rembourrage:

<ControlTemplate TargetType="Window"> 
    <Border Background="White" Padding="{TemplateBinding Padding}"> 
    <ContentPresenter /> 
    </Border> 
</ControlTemplate> 

(Vous voudrez probablement l'arrière-plan de la frontière pour être le pinceau de fond de fenêtre dynamique pour le code de production, mais vous obtenez l'idée.)

Vous pouvez évidemment placer ce modèle dans un sélecteur de modèle de style afin d'éviter d'avoir à le répéter sur chaque fenêtre.

Voici le modèle complet (généré avec Microsoft Expression):

<Style x:Key="WindowStyle" TargetType="{x:Type Window}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Window}"> 
       <Border Background="{TemplateBinding Background}" 
        BorderBrush="{TemplateBinding BorderBrush}" 
        BorderThickness="{TemplateBinding BorderThickness}" 
        Margin="{TemplateBinding Margin}" 
        Padding="{TemplateBinding Padding}"> 

        <AdornerDecorator> 
         <ContentPresenter/> 
        </AdornerDecorator> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="ResizeMode" Value="CanResizeWithGrip"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type Window}"> 
         <Border Background="{TemplateBinding Background}" 
          BorderBrush="{TemplateBinding BorderBrush}" 
          BorderThickness="{TemplateBinding BorderThickness}"> 

          <Grid> 
           <AdornerDecorator> 
            <ContentPresenter/> 
           </AdornerDecorator> 
           <ResizeGrip 
            x:Name="WindowResizeGrip" 
            HorizontalAlignment="Right" 
            VerticalAlignment="Bottom" 
            IsTabStop="false" 
            Visibility="Collapsed" 
           /> 
          </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> 
       </Setter.Value> 
      </Setter> 
     </Trigger> 
    </Style.Triggers> 
</Style> 
+0

I essayé, et malheureusement, cela ne fonctionne pas. Je suppose que la raison en est que lorsque vous ciblez une fenêtre avec ControlTemplate.DataType, vous ne ciblez que la classe de base Window mais pas Window1 qui hérite de window. Ai-je tort? En outre, je pense qu'il pourrait être dangereux de jouer avec le modèle car il pourrait contenir d'autres définitions que je vais perdre. Que dire, devrais-je abandonner et faire le plan B? – Shimmy

+0

Hmm, je n'ai pas essayé l'approche de la touche de style par défaut, mais cela fonctionne généralement bien avec les classes dérivées (parce qu'elles héritent de la clé de style par défaut de la classe de base). Mais vous pouvez toujours créer le style en tant que ressource de niveau application et le référencer explicitement via une source statique.Re déconner avec le modèle, hé, c'est ce que les modèles sont pour! \ * grin \ * Si vous avez des doutes, procurez-vous le complément Reflector BAML Viewer et voyez s'il y a un modèle de fenêtre par défaut que vous pouvez adapter (désolé, ne l'avez pas installé ici donc je ne peux pas vérifier moi-même). – itowlson

2

Voici une alternative simple: il suffit de définir une couleur d'arrière-plan sur votre Window et Margin sur le Grid au sein de votre Window: