2

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 イベントは決して発生しません。ここで何が問題なのですか?

4

2 に答える 2

1

解決しました。問題は、DragEnter イベントと Drop イベントを購読していたことです。それらを PreviewDragEnter と PreviewDrop に変更したところ、動作するようになりました

于 2013-09-05T11:37:29.393 に答える
0
private void frtbDragEnter(object sender, DragEventArgs e)
{
    if(!e.Data.GetDataPresent("myFormat") || sender == e.Source)
        e.Effects = DragDropEffects.None;
    else
        e.Effects = DragDropEffects.Move;
}
于 2013-09-05T11:21:46.373 に答える