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

Mik*_*lov 5 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>
Run Code Online (Sandbox Code Playgroud)

它看起来像这样:

现在我们删除Window.Resources:

<Window x:Class="MyApp.MainWindow" xmlns="..." xmlns:x="...">
<Grid>
    <TextBox VerticalAlignment="Top" HorizontalAlignment="Left">Test</TextBox>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

并将样式定义添加到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>
Run Code Online (Sandbox Code Playgroud)

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

为什么?

Cod*_*ked 5

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

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

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

更多信息可以在这里找到.