0

我正在设计一个样条编辑器,它由两部分(用户控件)组成,左侧控件是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 吗?

我可以重新考虑我的项目概念吗?

4

2 回答 2

0

查看您的应用程序详细信息Canvas对我来说很有意义。我曾在一个类似的应用程序上工作过,并创建了一个DesignerCanvas允许项目移动、调整大小等并且运行良好。

第一个问题:我也遇到了类似的问题,并决定在我的控件的位置添加一个增量;所以说第一个控件的位置是 0,0 那么下一个控件将放置在 10,10;接下来是 20,20;这样,所有控件都有可见区域并且可以选择(一旦选择它就会出现在顶部)。

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

看看这个具有类似实现的文章系列 -

WPF 图表设计器 -第 4部分、第 3部分、第 2部分、第 1 部分

于 2012-06-27T13:13:54.550 回答
0

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

Canvas位于选定项下的那些是不可点击的,因为 的ColorCanvas设置为Transparent。所以我可以看到他们,但不能与他们互动。

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

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

它也将解决我的第二个问题,因为我会设置我UserControl想要的大小,并且仍然UserControls在我的视图中选择其他。

这是一个肮脏的把戏,但我会避免这CustomPanel件事。

无论如何,谢谢 akjoshi 和 Danny Varod 为您的关注 ^^ 您的回答仍然有用,因为我将在我正在处理的另一个项目中使用它们。只是这个时间太短了。

于 2012-06-28T11:58:41.573 回答