Silverlight 为ItemsControl中的StackPanel元素设置样式时出现问题
如果我创建一个简单的Silverlight 为ItemsControl中的StackPanel元素设置样式时出现问题,silverlight,xaml,silverlight-5.0,Silverlight,Xaml,Silverlight 5.0,如果我创建一个简单的StackPanel,并在其中放置一些项目,并定义一个样式来添加边距,所有这些都可以正常工作,如下面的快速示例所示: <StackPanel Grid.Row="1" Orientation="Vertical"> <StackPanel.Resources> <Style TargetType="module:ModuleElement"> <Sette
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>
上面代码中添加的几个项目用于测试目的-在这种情况下,边距是默认值(0)
发生什么事了?为什么这不起作用?我需要做什么来解决这个问题?当然,我可以为每个元素手动设置边距,但我觉得我遗漏了一些东西,我更希望看到它在
样式中定义。您可以将样式放入ItemsControl资源而不是StackPanel资源中:
<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中的资源查找遍历“对象树”(请参阅),据我所知,这不是可视化树,而是XAML中定义的树。虽然这确实有效(我肯定会投票),但这并不能真正解释问题。我的代码基于一个类似的场景,我使用了WrapPanel
而不是StackPanel
,在这种情况下,我的解决方案(将资源
放在WrapPanel
定义中)起作用,所以。。。为什么它在当时有效而现在无效?你是说在ItemsControl中作为ItemsPanel的WrapPanel?那真的很奇怪。是的,没错。代码在这种情况下工作。除非我运气好,而且包装纸本来就不应该起作用;P
<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>