我正在设计一个样条编辑器,它由两部分(用户控件)组成,左侧控件是DesignerControl,右侧是InfoControl。它们共享相同的 DataContext:DesignerVM和
ObservableCollection<SplineVM> SplineVMList;
DesignerControl是一个ItemsControl模板化为Canvas(“mycanvas”), ItemsSource 绑定到SplineVMList和 ItemTemplate 设置为SplineControl。
InfoControl是一个显示SplineVM的列表框和一个显示 SplineVM 属性的网格。
在SplineControl 中,我有一个包含 4 个可拖动点(矩形)和 2 条将绑定到这些点的线的画布。一切正常,我可以拖动我的点,我的线条移动。
<UserControl>
<Canvas Width="300" Height="300" x:Name="mycanvas" Background="Transparent">
<Path x:Name="curve" Stroke="#F02828" StrokeThickness="3">
<Path.Data>
<PathGeometry>
<PathGeometry.Figures>
<PathFigureCollection>
<PathFigure>
<PathFigure.Segments>
<PathSegmentCollection x:Name="pathsegment"/>
</PathFigure.Segments>
</PathFigure>
</PathFigureCollection>
</PathGeometry.Figures>
</PathGeometry>
</Path.Data>
</Path>
<Rectangle x:Name="curvePoint1" Width="10" Height="10" Canvas.Bottom="0" Canvas.Left="0" />
<Rectangle x:Name="curvePoint2" Width="10" Height="10" RadiusX="4" RadiusY="4" Canvas.Bottom="0" Canvas.Left="{Binding ElementName=mycanvas, Path=ActualWidth, Converter={StaticResource mathconverter}, ConverterParameter=(@VALUE/4)}"/>
<Rectangle x:Name="curvePoint3" Width="10" Height="10" RadiusX="4" RadiusY="4" Canvas.Bottom="0" Canvas.Left="{Binding ElementName=mycanvas, Path=ActualWidth, Converter={StaticResource mathconverter}, ConverterParameter=(@VALUE/2)}"/>
<Rectangle x:Name="curvepoint4" Width="10" Height="10" Canvas.Bottom="0" Canvas.Left="{Binding ElementName=mycanvas, Path=ActualWidth, Converter={StaticResource mathconverter}, ConverterParameter=(@VALUE)}"/>
<Line x:Name="line1" Stroke="#dfdfdf" StrokeThickness="1"/>
<Line x:Name="line2" Stroke="#dfdfdf" StrokeThickness="1"/>
</Canvas>
</UserControl>
我的第一个问题是我必须使用一个容器(这里是 Canvas)来保存路径、矩形和线条。
当我在 mycanvas 中添加SplineControl时,它的位置很好,我可以立即拖动我的点,但是当我添加另一个 UserControl 时,它被放置在前一个的上方,我无法选择第一个 Usercontrol 的点。
我不想使用 IsHitTestVisible,因为我想从第一个 userControl 到第二个中选择点。
我的第二个问题: 由于我使用 Canvas 将我的东西保存在 SplineControl 中,我可以将点拖动到画布之外并仍然与它进行交互,乍一看它很棒。
但是再想一想,当我移动一个点以始终将我的点放在画布中时,我想调整我的画布的大小。但也让我的其他点位置更新关于 mycanvas 的比例。
您知道任何具有这种行为并且可以替换我的 Canvas 的控件吗?我应该使用 CustomControl 而不是 UserControl 吗?
我可以重新考虑我的项目概念吗?