WPF ControlTemplate с foreach?

В настоящее время я пытаюсь создать классы для WPF-приложения, похожего на рисование. У меня есть базовые классы LineMovement (линия от StartPoint до EndPoint) и PathMovement (линия, проходящая через все точки, указанные в свойстве Points типа PointCollection). Эти классы наследуются от Control и просматриваются через ControlTemplate.

Теперь я хочу добавить (то, что я называю) PointMovers в ControlTemplate. Это должны быть небольшие визуальные элементы, расположенные на каждой из точек в любом из классов Движения. Они должны стать чем-то вроде механизма захвата, чтобы перетаскивать нижележащую точку.

Проблема, конечно, в том, что я не знаю способа создать переменное количество элементов в ControlTemplate. Было бы здорово, если бы я мог сделать что-то вроде этого:

<Style x:Key="{x:Type mov:PathMovement}" TargetType="{x:Type mov:PathMovement}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type mov:PathMovement}">
                <Grid>
                    <Polyline Points="{TemplateBinding Points}" />
                    <!-- interesting part start -->
                    <foreach loopvariable="Point" in="{TemplateBinding Points}">
                        <PointMover Point="Point" />
                    </foreach>
                    <!-- interesting part end -->
                </Grid>
           </ControlTemplate>
       </Setter.Value>
  </Setter>
</Style>

Это возможно? Есть ли у вас другой подход, который мог бы сработать?

Заранее спасибо!


person chrischu    schedule 24.08.2009    source источник


Ответы (1)


Используйте ItemsControl вместе с ItemTemplate:

<ItemsControl ItemsSource="{Binding Points}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <!-- rendered for each point -->
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Судя по вашему варианту использования, вы также можете прочитать AdornerLayers.

person Kent Boogaart    schedule 24.08.2009
comment
Выглядит неплохо. Я попробую это. Однако относительно вашего совета с AdornerLayers: я читал, что нет способа указать их в XAML, поэтому я не буду его использовать (чтобы не смешивать XAML и код больше, чем это абсолютно необходимо). - person chrischu; 24.08.2009