ボタンのグリッドを持つ 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 システムを使用する動機となる要因であるため、コンテナーとアプリケーション インスタンス間のドラッグを含めるように質問を更新しました。