在可调整大小的画布中拖动项目

时间:2012-06-27 12:57:04

标签: wpf resize controls traversal

我正在设计一个由两部分组成的样条编辑器(usercontrols) 左侧控件是 DesignerControl ,右侧控件是 InfoControl 。它们与

共享相同的DataContext: DesignerVM
ObservableCollection<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吗?

我可以再考虑一下我的项目的概念吗?

2 个答案:

答案 0 :(得分:0)

使用Canvas查看您的申请详情对我来说很有意义。我已经开发了类似的应用程序并创建了DesignerCanvas允许项目移动,调整大小等等并且运行良好。

第一个问题:我也遇到了类似的问题,并决定在我的控件的位置添加一个delta;所以说第一个控件的位置是0,0然后下一个控件将被放置在10,10;然后在20,20;通过这种方式,所有控件都具有可见区域并且可以选择(一旦它被选中它就会到达顶部)。

第二个问题:拖动控件时增加Canvas的宽度和高度并确保不允许将控件放在Canvas外部,这不是一个大问题。将尝试查看是否可以找到与此相关的代码。

查看具有类似实现的本系列文章 -

WPF图设计师 - Part 4Part 3Part 2Part 1

答案 1 :(得分:0)

事实上,我找到了一种方法来解决我通过其他项目选择项目的第一个问题。

由于每个Canvas的{​​{1}}设置为Color,因此所选项下的

Canvas无法点击。所以我可以看到它们但不与它们互动。

由于我已将Transparent属性设置为Background(或未明确设置),我可以点击并选择顶部项下的项目。

这是WPF的奇怪行为...... 有人有解释吗?

它也将解决我的第二个问题,因为我会将Null设置为我想要的尺寸,并在我的视图中选择其他UserControl

这是一个肮脏的伎俩,但我会避免UserControls的事情。

无论如何,akjoshi和Danny Varod对你的关注^^ 你的答案仍然有用,因为我将在我正在研究的另一个项目中使用它们。 只是时间很短。