在ItemsControl中为StackPanel元素设置样式时出现问题

时间:2014-01-13 11:48:53

标签: silverlight xaml silverlight-5.0

如果我创建一个简单的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:ModuleElementUserControl,但如果我使用默认控件,问题仍然存在,就像典型的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中定义......

1 个答案:

答案 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中定义的树。