Silverlight: сделать все потомки элемента иметь поле? - PullRequest
2 голосов
/ 01 декабря 2010

Есть ли в Silverlight 4 способ диктовать, что все элементы в StackPanel должны иметь поле вместо указания margin="10,0" для каждого?

Ответы [ 4 ]

2 голосов
/ 01 декабря 2010

Боюсь, это невозможно декларативно в XAML с StackPanel напрямую. В Silverlight / WPF существует концептуальная философия, согласно которой панель не должна изменять свойства своих дочерних элементов. Таким образом, вы могли бы реализовать свою собственную Panel, которая делает это в любом случае, или вы могли бы использовать ItemsControl, например:

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

    [...]

</ItemsControl>

ItemsControl по умолчанию использует StackPanel, вы можете использовать его свойство ItemsPanel, чтобы определить другую панель как ItemsPanelTemplate, если хотите.

1 голос
/ 02 декабря 2010

Я бы сделал это путем определения неявных стилей в ресурсах 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 будет применяться поле без необходимости определять его для каждого элемента управления.

Надеюсь, это поможет ...

Крис Андерсон

PS. Явное самореклама - это основано на уловке наследования в моей книге Профессиональные бизнес-приложения с Silverlight 4 :).

0 голосов
/ 01 декабря 2010

Вы также можете сделать это программно;Ваша StackPanel имеет коллекцию Children.Вы можете использовать это, чтобы перебрать их и установить поле.

0 голосов
/ 01 декабря 2010

Поместите стековую панель в элемент Border и установите для Border Padding значение 10 0

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...