4

我使用了一个拖动装饰器来克隆我的标签图像(拖动目标),但是现在我无法将我的标签放到我的文本框中,

这是我使用的代码(你可能会看到有 previewdragover ,我在 previewdragover 中写了 e.Handled = true 但没有帮助)我还将 tbox.AllowDrop 设置为 true :

文本框 :

  tbox.PreviewDrop += new DragEventHandler(tbox_PreviewDrop);
  tbox.PreviewDragOver += new DragEventHandler(tbox_PreviewDragOver);

文本框的处理程序:

   protected void tbox_PreviewDrop(object sender, DragEventArgs e)
    {
        (sender as TextBox).Text = string.Empty; // Empty the textbox from previous answer.
        (sender as TextBox).Background = Brushes.White;
        e.Handled = true;
    }

标签(拖动目标):

             Label lbl = new Label();
             lbl.Content = s;
             lbl.Width = Double.NaN;
             lbl.Height = 40;
             lbl.FontSize = 19;
             lbl.MouseDown += new MouseButtonEventHandler(lbl_MouseDown);
             lbl.MouseMove += new MouseEventHandler(lbl_MouseMove);
             lbl.GiveFeedback += new GiveFeedbackEventHandler(lbl_GiveFeedback);
             lbl.MouseUp += new MouseButtonEventHandler(lbl_MouseUp); 
             wrapPanel2.Children.Add(lbl);

标签的处理程序:

        private void lbl_MouseUp(object sender, MouseButtonEventArgs e)
    {
        Mouse.OverrideCursor = Cursors.Arrow;
    }

    private void lbl_MouseDown(object sender, MouseButtonEventArgs e)
    {
        startPoint = e.GetPosition(this);

    }

    private void lbl_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.LeftButton == MouseButtonState.Pressed)
        {


            var source = sender as UIElement;
            Label lbl = sender as Label;
            Point current = e.GetPosition(this);
            Vector diff = startPoint - current;

            if (Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance ||
                Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)
            {

                adorner = new DragAdorner(lbl, e.GetPosition(lbl));
                AdornerLayer.GetAdornerLayer(lbl).Add(adorner);

                var dragData = new DataObject(this);
                DragDrop.DoDragDrop(source, dragData, DragDropEffects.Copy);
                AdornerLayer.GetAdornerLayer(lbl).Remove(adorner);
            }
            startPoint = current;
        }
    }

    private void lbl_GiveFeedback(object sender, GiveFeedbackEventArgs e)
    {
        if (adorner != null)
        {
            Label lbl = sender as Label;
            var pos = lbl.PointFromScreen(GetMousePosition());
            adorner.UpdatePosition(pos);
        }
    }

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    internal static extern bool GetCursorPos(ref Win32Point pt);

    [StructLayout(LayoutKind.Sequential)]
    internal struct Win32Point
    {
        public Int32 X;
        public Int32 Y;
    };

    public static Point GetMousePosition()
    {
        Win32Point w32Mouse = new Win32Point();
        GetCursorPos(ref w32Mouse);
        return new Point(w32Mouse.X, w32Mouse.Y);
    }

    private Point startPoint;
    private DragAdorner adorner;

现在我可以用光标后面的标签拖动标签,但我不能将它们放在任何文本框中。

- - -编辑 - - - - - -

我已经为这样的文本框放置了一个拖动器:

       private void tbox_PreviewDragEnter(object sender, DragEventArgs e)
    {
        if (sender == e.Source)
        {
            e.Effects = DragDropEffects.None;
        }

    }

仍然无法正常工作。

我将在此处添加我使用过的 DragAdorner.cs(我从一些中文网站获得):

public class DragAdorner : Adorner {

public DragAdorner(UIElement adornedElement, Point offset)

    : base(adornedElement) {

    this.offset = offset;

    vbrush = new VisualBrush(AdornedElement);
    vbrush.Opacity = .7;

}



public void UpdatePosition(Point location) {

    this.location = location;

    this.InvalidateVisual();

}



protected override void OnRender(DrawingContext dc) {

    var p = location;

    p.Offset(-offset.X, -offset.Y);

    dc.DrawRectangle(vbrush, null, new Rect(p, this.RenderSize));

}



private Brush vbrush;

private Point location;

private Point offset;
4

3 回答 3

3

问题是你的拖曳装饰器总是在上面。当您尝试放下标签时,它会落在装饰器上而不是底层组件上。

为了避免这种情况,将以下行添加到 DragAdorner 的构造函数中。

IsHitTestVisible = 假;

于 2016-10-03T13:23:46.123 回答
0

您的代码与我的工作示例有些不同,但我认为我可以看到您的问题。在我的代码中,我有一个名为UpdateDragDropEffects. 此方法接收一个DragEventArgs名为的对象并根据属性的值e更新属性,以及我是否有一个有效的实例要调用以及数据是否属于预期的类型等。e.Effectse.AllowedEffectsICommand

这个方法被调用(和DragEventArgs传递的对象)两个典型的拖放方法;DragTargetPreviewDrop(处理PreviewDrop事件)和AdornedUIElementPreviewDragOver(处理PreviewDragOver事件)。设置对象的e.Effects属性DragEventArgs告诉系统当前的拖拽操作是否有效,是否应该继续……不设置,或者设置为DragDropEffects.None将具有不显示任何有效拖放目标的效果。

MSDN的Drag and Drop Overview页面提供的代码示例也应该对您有所帮助。该Enabling an Element to be a Drop Target部分的示例代码显示了我所描述的内容。

您也可能有其他问题,但如果这对您没有帮助,请回来更新。

于 2013-08-05T11:59:53.170 回答
0

用 Point(-5,-5) 初始化 Dragadorner。(新 DragAdorner(新点(-5,-5));)

drop 事件似乎被扔到了 Adorner 上。如果您向 Adorner 添加一个放置处理程序,您会看到它在您释放鼠标时被调用。

似乎鼠标指针位于装饰器上方,并将其作为目标。

将偏移量设置为一个点,以便装饰器不在鼠标指针下方,可以更正该行为。

于 2016-03-04T10:28:04.310 回答