2010-01-03 5 views
14

io pongo peroperty margin e padding di una finestra e non ha effetto:Window.Margin & Window.Padding non funzionano

Ecco un esempio:

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

Risultato:
alt text

il risultato desiderato è che la cornice rossa della etichetta deve essere lontano 44px dal telaio della finestra (margine + padding).

Sì, so che posso impostare il margine dell'etichetta, ma non è quello che voglio. Ho un intero progetto che tutte le sue finestre sono impostate su uno stile, voglio impostare queste proprietà (o altro) nello stile generale della finestra.

Immagino che se non troverò alcuna soluzione creerò uno stile con nome per l'avidità dove imposterò il margine/riempimento, poi andrò Finestra per finestra e imposterò lo stile della Griglia, ma questa è l'ultima opzione I lo voglio fare.
Grazie in anticipo.

risposta

6

Non è sorprendente che Margine non funzioni, perché Margine è la quantità di spazio da posizionare sul controllo. Per una finestra, ciò significherebbe rendere il frame più piccolo (e offset), non l'area client, e sarebbe un po 'strano (e potrebbe non funzionare bene con l'ambiente di hosting Win32, non è sicuro). È è un po 'sorprendente che Padding non funziona, e non sono sicuro del perché sarebbe.

Tuttavia, v'è una soluzione che si può incapsulare in uno stile: sostituire il predefinito Finestra ControlTemplate con il proprio modello che non rispetta l'imbottitura:

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

(probabilmente vorrete lo sfondo del bordo di essere il pennello di sfondo finestra dinamica per il codice di produzione, ma si ottiene l'idea.)

Ovviamente è possibile inserire questo modello in uno stile Template setter in modo da evitare di doverlo ripetere su ogni finestra.

Ecco il modello completo (generati con 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 provato, e sfortunatamente non funziona. Immagino che il motivo sia che quando scegli una finestra con ControlTemplate.DataType hai come target solo la classe base Window ma non Window1 che eredita dalla finestra. Ho sbagliato? Inoltre, penso che potrebbe essere pericoloso fare casino con il Template poiché potrebbe contenere altre definizioni che perderò. Whatcha say, dovrei rinunciare e fare piano B? – Shimmy

+0

Hmm, non ho provato l'approccio chiave di stile predefinito, ma di solito funziona bene con le classi derivate (perché ereditano la chiave di stile predefinita dalla classe base). Ma è ancora possibile creare lo stile come risorsa a livello di applicazione e farvi riferimento esplicitamente tramite una risorsa statica.Riempire con il modello, hey, ecco a cosa servono i template! \ * grin \ * Se sei dubbioso, scarica il componente aggiuntivo Reflector BAML Viewer e verifica se esiste un modello di finestra predefinito che puoi adattare (scusa, non installarlo qui, quindi non posso controllarmi). – itowlson

2

Ecco una semplice alternativa: basta impostare un colore di sfondo sul tuo Window e il Margin sul Grid all'interno Window: