我正在设计一个由两部分组成的样条编辑器(usercontrols) 左侧控件是 DesignerControl ,右侧控件是 InfoControl 。它们与
共享相同的DataContext: DesignerVMObservableCollection<SplineVM> SplineVMList;
DesignerControl 是一个 ItemsControl 模板为画布(“mycanvas”),其中ItemsSource绑定到 SplineVMList , ItemTemplate设置为 SplineControl 。
InfoControl 是一个列表框,显示 SplineVMs 和网格,显示SplineVMs的属性。
在 SplineControl 中,我有一个包含4个可拖动点(矩形)的Canvas和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吗?
我可以再考虑一下我的项目的概念吗?
答案 0 :(得分:0)
使用Canvas
查看您的申请详情对我来说很有意义。我已经开发了类似的应用程序并创建了DesignerCanvas
允许项目移动,调整大小等等并且运行良好。
第一个问题:我也遇到了类似的问题,并决定在我的控件的位置添加一个delta;所以说第一个控件的位置是0,0然后下一个控件将被放置在10,10;然后在20,20;通过这种方式,所有控件都具有可见区域并且可以选择(一旦它被选中它就会到达顶部)。
第二个问题:拖动控件时增加Canvas的宽度和高度并确保不允许将控件放在Canvas外部,这不是一个大问题。将尝试查看是否可以找到与此相关的代码。
查看具有类似实现的本系列文章 -
答案 1 :(得分:0)
事实上,我找到了一种方法来解决我通过其他项目选择项目的第一个问题。
由于每个Canvas
的{{1}}设置为Color
,因此所选项下的 Canvas
无法点击。所以我可以看到它们但不与它们互动。
由于我已将Transparent
属性设置为Background
(或未明确设置),我可以点击并选择顶部项下的项目。
这是WPF的奇怪行为...... 有人有解释吗?
它也将解决我的第二个问题,因为我会将Null
设置为我想要的尺寸,并在我的视图中选择其他UserControl
。
这是一个肮脏的伎俩,但我会避免UserControls
的事情。