开发者

Silverlight: Make all descendants of an element have a margin?

Is there a way in Silverlight 4 to dictate that all elements开发者_Go百科 within a StackPanel must have a margin, instead of specifying margin="10,0" on each one?


I'm afraid it's not possible declaratively in XAML with the StackPanel directly. It's the conceptual philosophy in Silverlight/WPF that a panel should not modify properties of its children. So you could implement your own Panel that does so anyway, or you could use an ItemsControl like that:

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

    [...]

</ItemsControl>

An ItemsControl uses a StackPanel by default, you can use its ItemsPanel property to define another Panel as an ItemsPanelTemplate if you wish so.


The way I'd do it is by defining implicit styles in the StackPanel's resources, for each control type that will be used within the StackPanel. To save defining the value repeatedly for each control type, you can create a named base style that targets FrameworkElement and defines the style(s), from which the style for each control type can inherit. An example is below:

<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>

Note how each control in the StackPanel will have the margin applied, without needing to define it on each control.

Hope this helps...

Chris Anderson

PS. Blatant self promotion - this is based upon the inheritance trick in my book Pro Business Applications with Silverlight 4 :).


Put your stackpanel within a Border element and set the Border Padding to "10 0"


You can also do this programmatically; your StackPanel has a Children collection. You could use this to iterate through them and set the margin.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜