2010-01-03 29 views
14

estoy ajuste de margen peroperty y el relleno de una ventana y que no entra en vigor:Window.Margin y Window.Padding no funcionan

Aquí se muestra un ejemplo:

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

Resultado:
alt text

el resultado deseado es que el marco rojo de la lable debe estar lejos 44px desde el marco de la ventana (margen + relleno).

Sí, sé que puedo establecer el margen de la etiqueta, pero eso no es lo que quiero. Tengo todo un proyecto en el que todas sus ventanas están configuradas con un estilo, quiero establecer estas propiedades (u otras) en el estilo de ventana general.

Supongo que si no encuentro ninguna solución, crearé un estilo con nombre para la codicia donde estableceré el margen/relleno, luego iré ventana por ventana y estableceré el estilo de la cuadrícula, pero esa es la última opción que quiero hacer.
Gracias de antemano.

Respuesta

6

No es de extrañar que el margen no funciona, porque El margen es la cantidad de espacio que se coloca alrededor de el control. Para una ventana, esto significaría hacer el marco más pequeño (y compensado), no el área del cliente, y eso sería un poco extraño (y podría no funcionar muy bien con el entorno de alojamiento Win32, no estoy seguro). Es es un poco sorprendente que Padding no funciona, y no estoy seguro de por qué sería eso.

Sin embargo, hay una solución que se puede encapsular en un estilo: reemplazar el valor por defecto de la ventana ControlTemplate con su propia plantilla que respeta el relleno:

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

(Probablemente sería deseable que la frontera del fondo para estar el cepillo de fondo de ventana dinámica para el código de producción, pero se entiende la idea)

Obviamente, puede colocar esta plantilla en un moldeador de plantillas de estilo para evitar tener que repetirla en cada ventana.

Aquí es la plantilla completa (generado 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 intentado, y desafortunadamente no funciona. Supongo que la razón es que cuando se orienta la ventana con ControlTemplate.DataType, se orienta solo a la clase base de la ventana, pero no a Window1 que hereda de la ventana. ¿Me equivoco? Además, estoy pensando que podría ser peligroso meterse con la plantilla ya que podría contener otras definiciones que perderé. ¿Qué dices, debería abandonar y hacer el Plan B? – Shimmy

+0

Hmm, no probé el enfoque de clave de estilo predeterminado, pero generalmente funciona bien con las clases derivadas (porque heredan la clave de estilo predeterminada de la clase base). Pero aún puede crear el Estilo como un recurso de nivel de aplicación y hacer referencia explícitamente a través de un StaticResource.Volver a jugar con la plantilla, oye, ¡para eso están las plantillas! \ * grin \ * Si tiene dudas, obtenga el complemento Reflector BAML Viewer y vea si hay una plantilla de ventana predeterminada que pueda adaptar (lo siento, no lo tengo instalado aquí, así que no puedo controlarlo). – itowlson

2

Aquí hay una alternativa simple: basta con establecer un color de fondo en su Window y la Margin en el Grid dentro de su Window:

Cuestiones relacionadas