如何将单个控件实例添加到ItemsPanelTemplate?

时间:2012-02-27 15:02:39

标签: c# wpf itemscontrol

在我的项目中,我有一个ItemsControl,其ItemsPanel模板为Grid我想在此网格中添加一个控件,完全独立于ItemsControl'Items',可以在代码隐藏中访问。 这样做的最佳方式是什么?

更多细节:

我正在WPF中实现一个关键帧动画时间轴。我通过一组绑定到ItemsControl的“指标”来做到这一点;然后ItemsControl使用Margin属性根据它们的位置将每个这些位置放在Grid上:

    <DataTemplate x:Key="keyIndicatorTemplate">
        <Border Width="1" Height="1" 
                BorderBrush="Black" Background="Black" BorderThickness="0" 
                HorizontalAlignment="Left" VerticalAlignment="Top"
                Margin="{Binding Converter={StaticResource ResourceKey=keyIndicatorMarginConv}}"
                ></Border>
    </DataTemplate>

        

然后,这个指标网格自动调整到关键帧的大小,并使用ItemsControl LayoutTransform属性和包含的ScrollViewer进行缩放和平移:

<Grid>
 <ScrollViewer Name="timelineScrollViewer" Background="LightCyan" HorizontalScrollBarVisibility="Visible">

    <ItemsControl Name="KeyGridPresenter" ItemTemplate="{StaticResource ResourceKey=keyIndicatorTemplate}" >

            <ItemsControl.LayoutTransform>
                <ScaleTransform 
                    ScaleX="{Binding Path=ZoomX, ElementName=TimelineUserControl}" 
                    ScaleY="{Binding Path=ZoomY, ElementName=TimelineUserControl}">
                </ScaleTransform>
            </ItemsControl.LayoutTransform>

                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <Grid Name="KeyGrid">
                        </Grid>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>

     </ItemsControl>

 </ScrollViewer>
</Grid>

我想添加一个用户用鼠标控制的半透明“荧光笔/插入符号”,但由于此设计基于网格是ItemsControl和{{ScrollViewer和{{ 1}}提供一个'窗口',我需要添加控件,使容器的变换适用于它(即网格的兄弟或子节点)

如何修改我的ItemsTemplate,以便它实例化一个单独的控件(边框/矩形/等),与项目无关?

1 个答案:

答案 0 :(得分:1)

您无法修改用作ItemsPanelTemplate

的面板的子项

我通常做的是将ItemsControl和叠加控件放在允许其子项重叠的面板中,例如Grid

例如,

<ScrollViewer Name="timelineScrollViewer" ...>
    <Grid>

        <ItemsControl Name="KeyGridPresenter" ... >

        </ItemsControl>

        <Grid x:Name="SomethingDrawnOnTopOfItemsControl">
            ...
        </Grid>

    </Grid>
 </ScrollViewer>