Silverlight:使一个元素的所有子元素都有一个边距?

Silverlight:使一个元素的所有子元素都有一个边距?,silverlight,xaml,Silverlight,Xaml,Silverlight 4中是否有办法规定StackPanel中的所有元素必须有边距,而不是在每个元素上指定margin=“10,0”?将StackPanel放在边框元素中,并将边框填充设置为“10 0”恐怕不能直接在XAML中使用StackPanel声明。Silverlight/WPF的概念哲学是,面板不应修改其子级的属性。因此,您可以实现自己的面板,也可以使用ItemsControl,如下所示: <ItemsControl> <ItemsControl.ItemTe

Silverlight 4中是否有办法规定
StackPanel
中的所有元素必须有边距,而不是在每个元素上指定
margin=“10,0”

将StackPanel放在边框元素中,并将边框填充设置为“10 0”

恐怕不能直接在XAML中使用
StackPanel
声明。Silverlight/WPF的概念哲学是,面板不应修改其子级的属性。因此,您可以实现自己的面板,也可以使用
ItemsControl
,如下所示:

<ItemsControl>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <ContentPresenter Margin="10,0" Content="{Binding Content}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>

    [...]

</ItemsControl>

[...]

ItemsControl
使用
StackPanel
默认情况下,您可以使用其
ItemsPanel
属性将另一个面板定义为
ItemsPanelTemplate
,如果您愿意的话。

您也可以通过编程方式执行此操作;您的StackPanel有一个子集合。您可以使用它来迭代它们并设置边距。

我的方法是在StackPanel的资源中为StackPanel中使用的每个控件类型定义隐式样式。要保存对每个控件类型重复定义值的操作,可以创建一个命名的基础样式,该样式以FrameworkElement为目标,并定义每个控件类型的样式可以从中继承的样式。一个例子如下:

<StackPanel Orientation="Horizontal">
    <StackPanel.Resources>
        <Style x:Key="CommonStyle" TargetType="FrameworkElement">
            <Setter Property="Margin" Value="10,0" />
        </Style>
        <Style TargetType="Button" BasedOn="{StaticResource CommonStyle}" />
        <Style TargetType="TextBlock" BasedOn="{StaticResource CommonStyle}" />
        <Style TargetType="CheckBox" BasedOn="{StaticResource CommonStyle}" />
    </StackPanel.Resources>

    <Button>Button</Button>
    <TextBlock Text="Text" />
    <CheckBox>Check Box</CheckBox>
</StackPanel>

按钮
复选框
注意StackPanel中的每个控件将如何应用边距,而无需在每个控件上定义边距

希望这有助于

克里斯·安德森


注:明显的自我提升-这是基于我书中的继承技巧:)。

您还可以通过将其
ItemsPanel
指定为StackPanel,确保ItemsControl的行为类似于StackPanel。尽管这可能是默认情况。至少这样可以控制方向。为什么StackPanel有边距属性时需要边框?这也没有考虑在每个孩子之间放置边距,OP可能希望这样做。