我正在开发一个自定义控件,其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()
由用户配置。
这似乎很简单,我必须遗漏一些东西。
答案 0 :(得分:0)
正如评论中所阐明的那样,管理RenderTransform
项目面板而不是单个项目大多可以实现作者想要的内容。
我通常建议在一个共同的anchestor容器中处理这样的转换,而不是为单个子元素的定位编写或多或少的复杂数学。
剩下的问题是,对于某些缩放因子,items面板将在其父控件的边界上增长。通过管理Panel.Clip
来防止这种情况与定位单个子元素的想法一样复杂。
解决方案:在项目面板周围的容器上设置ClipToBounds="True"
。这将剪切所有超出界限的内容,而无需任何手动数学计算某些特定缩放的界限。