在树视图和文本框之间拖放

本文关键字:之间 拖放 文本 视图 | 更新日期: 2023-09-27 18:30:26

我有一个网格,上面有两列。左列是树视图,右列是文本框。现在,我希望能够将项目从树视图拖到文本框中,并且所选树视图项的标题应附加到文本中。我在网络上搜索了很多"在控件之间拖放",但所有这些东西都对我不起作用。

我的实际代码是:

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工作正常。创建数据对象并获取正确的值。但是掉落和拖拽事件永远不会被触发。这是怎么回事?

在树视图和文本框之间拖放

解决了。问题是我已经订阅了DragEnter-and Drop-event。我将它们更改为PreviewDragEnter和PreviewDrop,现在它可以工作了

private void frtbDragEnter(object sender, DragEventArgs e)
{
    if(!e.Data.GetDataPresent("myFormat") || sender == e.Source)
        e.Effects = DragDropEffects.None;
    else
        e.Effects = DragDropEffects.Move;
}