2

ボタンのグリッドを持つ WPF アプリケーションを作成しています。ユーザーがグリッド間、おそらくアプリケーションの異なるインスタンス間でボタンをドラッグ アンド ドロップできるようにしたいと考えています。ボタンの PreviewMouseMove イベントにハンドラーを追加し、マウスの左ボタンが押されている場合は DoDragDrop を呼び出すことでこれを実行しようとしましたが、ボタンをドラッグ アンド ドロップすると、常に DoDragDrop を 2 回呼び出し、ドロップ イベント ハンドラーを 2 回呼び出すことになります。 . なぜこれが起こるのか、それを防ぐ方法を知っている人はいますか?

問題を示す XAML の例を次に示します。

<Window x:Class="WpfTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <DockPanel>
        <Button PreviewMouseMove="PreviewMouseMove" x:Name="m_button" Width="250">
            Hello, world!
        </Button>
        <Label Drop="Drop" AllowDrop="True">
            Drop here!
        </Label>
    </DockPanel>
</Window>

および対応するコード:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void PreviewMouseMove(object sender, MouseEventArgs e)
    {
        if (e.LeftButton == MouseButtonState.Pressed)
        {
            ++m_dragIndex;
            System.Console.WriteLine("Dragged: " + m_dragIndex.ToString());
            DragDrop.DoDragDrop(m_button, m_dragIndex, DragDropEffects.All);
            e.Handled = true;
        }
    }

    private void Drop(object sender, DragEventArgs e)
    {
        System.Console.WriteLine("Dropped: " + e.Data.GetData(typeof(Int32)).ToString());
    }

    private int m_dragIndex;
}

単一のドラッグの場合、これは出力に書き込まれます。

Dragged: 1
Dragged: 2
Dropped: 2
Dropped: 1

更新:上記のコード例を変更して、ボタンが何かにドロップされたときにどのドロップ イベントが呼び出されるかを示しました。

更新:これが DragDrop システムを使用する動機となる要因であるため、コンテナーとアプリケーション インスタンス間のドラッグを含めるように質問を更新しました。

4

2 に答える 2

0

私は同じ問題を抱えていました。私は、PreviewMouseMove が 2 回呼び出されたことを発見しました。これは、最初はコンテナー要素 (ListViewItem など) によって発生し、2 回目は TextBlock に対して発生したためです。したがって、この問題の別の回避策として、e.OriginalSource 値のタイプを確認することをお勧めします。

于 2014-02-22T20:44:41.600 に答える