0

あるキャンバスから別のキャンバスにアイテムをドラッグしようとしています。オブジェクトが他のキャンバスに入ったときにイベントが発生するようにします。Drag イベントはどれも発生していないようです。この質問の解決策に従ってみましたが、うまくいきません: ドラッグ アンド ドロップが期待どおりに応答しない

私のキャンバスはこれです:

<Window x:Class="DragEnterTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="DragEnterMainWindow" Height="460" Width="1000">
<Grid>
    <Canvas Name="Toolbox" Background="Beige" Height="400" Width="200" Margin="12,12,800,35">
        <Rectangle Name="dragRectangle" Canvas.Left="0" Canvas.Right="0" Width="50" Height="50" Fill="Red"
                   MouseLeftButtonDown="dragRectangle_MouseLeftButtonDown"
                   MouseLeftButtonUp="dragRectangle_MouseLeftButtonUp"
                   MouseMove="dragRectangle_MouseMove"
                   />
    </Canvas>
    <Canvas Background="Azure" Height="400" Margin="218,12,0,35" Name="mainCanvas" Panel.ZIndex="-1"
            DragEnter="mainCanvas_DragEnter"
            DragLeave="mainCanvas_DragLeave"
            PreviewDragEnter="mainCanvas_PreviewDragEnter"
            PreviewDragLeave="mainCanvas_PreviewDragLeave"
            AllowDrop="True"
            DragDrop.Drop="mainCanvas_Drop"
            />
</Grid>
</Window>

Panel.ZIndex="-1" がない場合、長方形は mainCanvas の下にドラッグされます。これは、長方形の ZIndex を正の値に設定した場合でも当てはまります。

私のコードは次のとおりで、私が見つけた例で変更されています。

namespace DragEnterTest
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    private bool _isRectDragInProg;

    public MainWindow()
    {
        InitializeComponent();
    }

    private void dragRectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        _isRectDragInProg = true;
        dragRectangle.CaptureMouse();
    }

    private void dragRectangle_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        _isRectDragInProg = false;
        dragRectangle.ReleaseMouseCapture();
    }

    private void dragRectangle_MouseMove(object sender, MouseEventArgs e)
    {
        if (!_isRectDragInProg) return;
        // get the position of the mouse relative to the Canvas
        var mousePos = e.GetPosition(Toolbox);

        // center the rect on the mouse
        double left = mousePos.X - (dragRectangle.ActualWidth / 2);
        double top = mousePos.Y - (dragRectangle.ActualHeight / 2);
        Canvas.SetLeft(dragRectangle, left);
        Canvas.SetTop(dragRectangle, top);
    }

    private void mainCanvas_DragEnter(object sender, DragEventArgs e)
    {
        string t = "Test";  // Never enters this event
    }

    private void mainCanvas_DragLeave(object sender, DragEventArgs e)
    {
        string t = "Test";  // Never enters this event
    }

    private void mainCanvas_PreviewDragEnter(object sender, DragEventArgs e)
    {
        string t = "Test";  // Never enters this event
    }

    private void mainCanvas_PreviewDragLeave(object sender, DragEventArgs e)
    {
        string t = "Test";  // Never enters this event
    }

    private void mainCanvas_Drop(object sender, DragEventArgs e)
    {
        string t = "Test";  // Never enters this event
    }
}

}

4

2 に答える 2

2

実際には何もドラッグしていません。キャンバス内のあちこちに長方形を移動しているだけです。

長方形がソースを離れるときに関数を呼び出す必要がありますDragDrop.DoDragDrop。また、後でターゲットに追加できるように、ソースから切り離す必要があります。

    // Drag - In mousemove event when mouse has gone out of toolbox
    DragDrop.DoDragDrop(
        Toolbox, 
        new DataObject("MyWPFObject", rectangle),
        DragDropEffects.Move
    );

    // Drop - In Drop event of target
    if (e.Data.GetDataPresent("MyWPFObject"))
    { 
       var rectangle = e.Data.GetData("MyWPFObject") as Rectangle
    ....

チュートリアル ...

于 2012-07-03T08:59:21.257 に答える
0

マウスをキャプチャしているためだと思うので、すべてのマウスイベントはドラッグされたによって処理されRectangle、それらはあなたのに渡されませんCanvas

個人的には、WPF の組み込みのドラッグ アンド ドロップ機能を使用する際にさまざまな問題が発生したため、MouseEvents代わりに使用することになりました。

私が使用した解決策は、この回答からのもので、次のようになりました。

  1. MouseDown左ボタンを押したままオン、位置を記録(オン位置をMouseLeave消去)

  2. で、左ボタンを押しMouseMoveた場合、位置が記録され、現在のマウス位置がデルタを超えて異なる場合、ドラッグ操作が進行中であることを示すフラグを設定し、アプリケーション (ドラッグされたオブジェクトではなく) にマウスをキャプチャさせます

  3. MouseMoveドラッグ操作が進行中の場合は、ヒット テストを使用して、四角形を配置する場所を決定し (四角形自体は無視します)、それに応じて親子関係と位置を調整します。

  4. ドラッグMouseUp操作中はマウスキャプチャを解除し、「ドラッグ操作中」フラグをクリアする

于 2012-07-03T13:02:37.763 に答える