为什么TextBox在App.xaml中设置Grid.Margin时得到填充?

时间:2011-08-04 16:03:02

标签: wpf styles

一个简单的窗口:

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

看起来像这样:

现在我们删除Window.Resources

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

将样式定义添加到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>

奇怪的是,TextBox现在得到了一个填充:

为什么?

2 个答案:

答案 0 :(得分:5)

当放置在Application资源中时,不从Control派生的元素(即Grid)的隐式样式将应用于该控件的所有实例。但是当Style被放置在任何其他地方时,它们将不会应用于某些实例。

实际上,ControlTemplate中的元素除了类型的隐式样式之外,除非在应用程序资源中定义了Style。

由于Grid不是控件(即它不是从Control派生的),因此将它的Style放在应用程序资源中会影响应用程序中的每个Grid。这包括控件的ControlTemplate中定义的网格,如TextBox。

可以找到更多信息here

答案 1 :(得分:1)

我认为文本框的默认内容在放置内部内容时包含网格。在应用程序资源中, TextBox 样式发生时,网格样式也会应用于 TextBox 内的网格

但是当在窗口资源中应用相同的网格样式时(即在发生全局样式之后),它不会影响 TextBox中的网格