2011-08-04 8 views
5

una ventana simple:¿Por qué TextBox obtiene un relleno cuando se establece Grid.Margin en App.xaml?

<Window x:Class="MyApp.MainWindow" xmlns="..." xmlns:x="..."> 

<Window.Resources> 
    <Style TargetType="Grid"> 
     <Setter Property="Margin" Value="8"/> 
    </Style> 
</Window.Resources> 

<Grid> 
    <TextBox VerticalAlignment="Top" HorizontalAlignment="Left">Test</TextBox> 
</Grid> 

</Window> 

Se ve así:

Ahora quitamos Window.Resources:

<Window x:Class="MyApp.MainWindow" xmlns="..." xmlns:x="..."> 
<Grid> 
    <TextBox VerticalAlignment="Top" HorizontalAlignment="Left">Test</TextBox> 
</Grid> 
</Window> 

y añadir a la definición de estilo de App.xaml:

<Application x:Class="MyApp.App" xmlns="..." xmlns:x="..." StartupUri="View\MainWindow.xaml"> 
<Application.Resources> 
    <Style TargetType="Grid"> 
     <Setter Property="Margin" Value="8"/> 
    </Style> 
</Application.Resources> 
</Application> 

Curiosamente, el cuadro de texto ahora recibe un acolchado:

¿Por qué?

Respuesta

5

Los estilos implícitos para elementos que no se derivan de Control (es decir, cuadrícula) se aplicarán a todas las instancias de ese control cuando se colocan en los recursos de la aplicación. Pero no se aplicarán a ciertas instancias cuando el Estilo se ubique en otro lugar.

Efectivamente, los elementos dentro de ControlTemplate están excluidos de los Estilos implícitos para su tipo, a menos que ese Estilo esté definido en los recursos de la aplicación.

Dado que Grid no es un control (es decir, no se deriva de Control), colocar su estilo en los recursos de la aplicación afectará a cada cuadrícula de la aplicación. Esto incluye Grillas definidas en ControlTemplate de controles, como TextBox.

Más información se puede encontrar here.

+0

+1 Lástima que nunca me di cuenta de que esto sucede de forma predeterminada. – loxxy

+0

@loxxy - Sí, es un matiz sutil que todavía tengo que encontrar documentación. – CodeNaked

+0

¡Bien, gracias! Entonces, ¿cuál es la mejor manera de evitar esto? Pon el diccionario en un archivo separado? ¿No configura estilos para Grid y Panel en absoluto? –

1

Supongo que el contenido predeterminado del cuadro de texto contiene una cuadrícula al colocar el contenido interno. Cuando en recursos de la aplicación, se produce el estilo cuadro de texto, el estilo de cuadrícula también se aplica a la rejilla dentro del cuadro de texto .

Pero cuando el mismo estilo de cuadrícula se aplica en los recursos de la ventana (es decir, después de que ocurra un estilo global), que no afecta a la cuadrícula dentro del cuadro de texto .

Cuestiones relacionadas