0

2 つの部分 (ユーザー コントロール) で構成されるスプライン エディターを設計しています。左側のコントロールはDesignerControlで、右側のコントロールはInfoControlです。同じ DataContext を共有します: DesignerVM

ObservableCollection<SplineVM> SplineVMList;

DesignerControlは、 ItemsSource がSplineVMListにバインドされ、 ItemTemplateが SplineControl として設定されたCanvas (「mycanvas」)としてテンプレート化されたItemsControlです。InfoControlは、SplineVMを表示する ListBox と、SplineVM のプロパティを表示するGridです。

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>

私の最初の問題は、パス、四角形、および線を保持するためにコンテナー (ここではキャンバス) を使用する必要があることです。

Mycanvasに SplineControl を追加すると適切に配置され、ポイントをすぐにドラッグできますが、別の UserControl を追加すると、前のものの上に配置され、最初の Usercontrol のポイントを選択できません。

最初の userControl から 2 番目までのポイントを選択したいので、IsHitTestVisible を使用したくありません。

私の 2 番目の問題: キャンバスを使用して自分のものを SplineControl に保持するため、キャンバスの外側にポイントをドラッグして操作することができます。

しかし、もう一度考えてみると、ポイントを移動するときにキャンバスのサイズを変更して、常にキャンバス内にポイントがあるようにしたいと考えています。また、mycanvas の比率を考慮して他のポイントの位置を更新します。

この動作を持ち、キャンバスを置き換えることができるコントロールを知っていますか? UserControl の代わりに CustomControl を使用する必要がありますか?

プロジェクトのコンセプトをもう一度考え直さなくてもいいですか?

4

2 に答える 2

0

実際、私はアイテム選択の最初の問題を他のアイテムで回避する方法を見つけました。

CanvasColorすべてのCanvasが に設定されているため、選択したものの下にある はクリックできませんでしたTransparent。そのため、それらを見ることはできましたが、対話することはできませんでした。

Backgroundプロパティを に設定したNull(または明示的に設定していない) ので、一番上の項目をクリックして選択できます。

これは WPF の奇妙な動作です...誰か説明がありますか?

2 番目の問題も解決します。これは、UserControl必要なサイズを設定UserControlsし、ビューでその他を選択するためです。

それは汚いトリックですが、私はそのCustomPanelことを避けます.

thx とにかく、あなたの懸念については akjoshi と Danny Varod ^^ あなたの答えは、私が取り組んでいる他のプロジェクトで使用するので、まだ役に立ちました。時間が足りないだけです。

于 2012-06-28T11:58:41.573 に答える
0

を使用してアプリケーションの詳細を見ると、Canvas私には理にかなっています。私は同様のアプリケーションに取り組み、DesignerCanvasアイテムの移動、サイズ変更などを許可するものを作成し、うまく機能しました。

最初の問題:私も同様の問題に直面し、コントロールの位置にデルタを追加することにしました。たとえば、最初のコントロールの位置が 0,0 の場合、次のコントロールは 10,10 に配置されます。次は 20,20 です。このようにして、すべてのコントロールに可視領域があり、選択可能です (選択するとすぐに一番上に表示されます)。

2 番目の問題: コントロールをドラッグしたときに Canvas の幅と高さを大きくして、コントロールを Canvas の外に配置できないようにすることは大きな問題ではありません。それに関連するコードを見つけることができるかどうかを確認します。

同様の実装を持つこの記事シリーズを見てください-

WPF ダイアグラム デザイナー -パート 4パート 3パート 2パート 1

于 2012-06-27T13:13:54.550 に答える