2 つの列を持つグリッドがあります。左の列は TreeView で、右の列は TextBox です。TreeView から TextBox に項目をドラッグできるようにしたいので、選択した TreeViewItem のヘッダーをテキストに追加する必要があります。Web で「コントロール間のドラッグ アンド ドロップ」をよく検索しましたが、これらすべてがうまくいきません。
私の実際のコードは次のとおりです。
private Point startPoint;
private void tvPreviewLeftMouseDown(object sender, MouseButtonEventArgs e)
{
startPoint = e.GetPosition(null);
}
private void tvPreviewMouseMove(object sender, MouseEventArgs e)
{
if(e.LeftButton == MouseButtonState.Released)
return;
Point mousePos = e.GetPosition(null);
Vector diff = startPoint - mousePos;
if (e.LeftButton == MouseButtonState.Pressed &&
Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance ||
Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)
{
TreeView treeView = sender as TreeView;
TreeViewItem treeViewItem = FindAnchestor<TreeViewItem>((DependencyObject)e.OriginalSource);
object val = treeView.ItemContainerGenerator.ItemFromContainer(treeViewItem);
DataObject dragData = new DataObject("myFormat", treeViewItem.Header);
DragDrop.DoDragDrop(treeViewItem, dragData, DragDropEffects.Move);
}
}
private static T FindAnchestor<T>(DependencyObject current)
where T : DependencyObject
{
do
{
if (current is T)
return (T) current;
current = VisualTreeHelper.GetParent(current);
} while (current != null);
return null;
}
private void frtbDrop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent("myFormat"))
{
var val = (string) e.Data.GetData("myFormat");
}
}
private void frtbDragEnter(object sender, DragEventArgs e)
{
if(!e.Data.GetDataPresent("myFormat") || sender == e.Source)
e.Effects = DragDropEffects.None;
}
対応する XAML は次のとおりです。
<Grid >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TreeView Grid.Column="0" x:Name="treeview" PreviewMouseLeftButtonDown="tvPreviewLeftMouseDown" PreviewMouseMove="tvPreviewMouseMove"/>
<TextBox Grid.Column="1" AllowDrop="True" Drop="frtbDrop" DragEnter="frtbDragEnter"/>
</Grid>
デバッグすると、メソッドtvPreviewMouseMoveが正常に動作します。DataObject が作成され、正しい値が取得されます。しかし、drop イベントと dragenter イベントは決して発生しません。ここで何が問題なのですか?