一个简单的窗口:
<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现在得到了一个填充:
为什么?
答案 0 :(得分:5)
当放置在Application资源中时,不从Control派生的元素(即Grid)的隐式样式将应用于该控件的所有实例。但是当Style被放置在任何其他地方时,它们将不会应用于某些实例。
实际上,ControlTemplate中的元素除了类型的隐式样式之外,除非在应用程序资源中定义了Style。
由于Grid不是控件(即它不是从Control派生的),因此将它的Style放在应用程序资源中会影响应用程序中的每个Grid。这包括控件的ControlTemplate中定义的网格,如TextBox。
可以找到更多信息here。
答案 1 :(得分:1)
我认为文本框的默认内容在放置内部内容时包含网格。在应用程序资源中, TextBox 样式发生时,网格样式也会应用于 TextBox 内的网格 。
但是当在窗口资源中应用相同的网格样式时(即在发生全局样式之后),它不会影响 TextBox中的网格 强>