WPF ItemsControl对项目应用其他转换?

时间:2017-08-23 08:17:32

标签: c# wpf xaml

我正在开发一个自定义控件,其Canvas管理自己的相机"这适用于所述Canvas内的所有孩子。我尝试了以下方法:

<ItemsControl x:Class="WpfApplication1.CanvasControl"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
              xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
              mc:Ignorable="d"
              d:DesignHeight="300" d:DesignWidth="300">

    <ItemsControl.ItemContainerStyle>
        <Style TargetType="FrameworkElement">
            <Setter Property="RenderTransform">
                <Setter.Value>
                    <TransformGroup>
                        <!--This has to be the item's transform...-->
                        <MatrixTransform Matrix="{Binding Path=RenderTransform, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type FrameworkElement}} }" />
                        <!--This will be replaced with my own transform later on-->
                        <TranslateTransform X="100" Y="10" />
                    </TransformGroup>
                </Setter.Value>
            </Setter>
        </Style>
    </ItemsControl.ItemContainerStyle>

    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas Background="White" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>

    <ItemsControl.Items>
        <Rectangle Width="100" Height="50" Stroke="Magenta" StrokeThickness="3" Fill="OrangeRed" />
        <Button Content="Hello world">
            <Button.RenderTransform>
                <TranslateTransform X="-10" Y="-10"/>
            </Button.RenderTransform>
        </Button>
    </ItemsControl.Items>
</ItemsControl>

在此示例中,Button应位于X-10;Y-10 相对 OrangeRed Rectangle,但RenderTransform位于Style我的RenderTransform似乎被Button中的Button覆盖了。这使得X-10;Y-10显示在Canvas. 相对ItemsControl

最终DataTemplateSelector将有ItemsSource.ToList()由用户配置。

这似乎很简单,我必须遗漏一些东西。

1 个答案:

答案 0 :(得分:0)

正如评论中所阐明的那样,管理RenderTransform项目面板而不是单个项目大多可以实现作者想要的内容。

我通常建议在一个共同的anchestor容器中处理这样的转换,而不是为单个子元素的定位编写或多或少的复杂数学。

剩下的问题是,对于某些缩放因子,items面板将在其父控件的边界上增长。通过管理Panel.Clip来防止这种情况与定位单个子元素的想法一样复杂。

解决方案:在项目面板周围的容器上设置ClipToBounds="True"。这将剪切所有超出界限的内容,而无需任何手动数学计算某些特定缩放的界限。