如果我创建一个简单的StackPanel
并在其中放置一些项目并定义一个样式来添加边距,那么一切都很有效,如此快速示例所示:
<StackPanel Grid.Row="1" Orientation="Vertical">
<StackPanel.Resources>
<Style TargetType="module:ModuleElement">
<Setter Property="Margin" Value="20"/>
</Style>
</StackPanel.Resources>
<module:ModuleElement/>
<module:ModuleElement/>
</StackPanel>
显然module:ModuleElement
是UserControl
,但如果我使用默认控件,问题仍然存在,就像典型的Button
一样。
但是,我不想只是StackPanel
- 我想要一个ItemsControl
。所以我定义了我的控件:
<ItemsControl Grid.Row="1" Margin="20,0,20,0">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical">
<StackPanel.Resources>
<Style TargetType="module:ModuleElement">
<Setter Property="Margin" Value="0,20,0,0"/>
</Style>
</StackPanel.Resources>
</StackPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.Items>
<module:ModuleElement/>
<module:ModuleElement/>
</ItemsControl.Items>
</ItemsControl>
上面代码中添加的少数项目仅用于测试目的 - 在这种情况下,边距是默认值(0)。
发生了什么事?为什么这不起作用?我需要做些什么来解决这个问题?我当然可以手动为每个元素设置边距,但我觉得我错过了一些东西,而更愿意看到它在Style
中定义......
答案 0 :(得分:1)
您可以将Style放入ItemsControl Resources而不是StackPanel Resources:
<ItemsControl Grid.Row="1" Margin="20,0,20,0">
<ItemsControl.Resources>
<Style TargetType="module:ModuleElement">
<Setter Property="Margin" Value="0,20,0,0"/>
</Style>
</ItemsControl.Resources>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.Items>
<module:ModuleElement/>
<module:ModuleElement/>
</ItemsControl.Items>
</ItemsControl>
Silverlight中的资源查找遍历“对象树”(参见here),据我所知,这不是可视化树,而是XAML中定义的树。