首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Drag Adorner进行拖放

使用Drag Adorner进行拖放
EN

Stack Overflow用户
提问于 2013-08-05 16:39:12
回答 3查看 10.3K关注 0票数 4

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

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

TextBox:

代码语言:javascript
复制
  tbox.PreviewDrop += new DragEventHandler(tbox_PreviewDrop);
  tbox.PreviewDragOver += new DragEventHandler(tbox_PreviewDragOver);

textbox的处理程序:

代码语言:javascript
复制
   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;
    }

标签(拖动目标):

代码语言:javascript
复制
             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);

标签的处理程序:

代码语言:javascript
复制
        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;

现在,我可以拖动标签,使其跟随光标,但不能将它们放到任何文本框中。

-编辑

我已经为文本框放置了一个拖拽工具,如下所示:

代码语言:javascript
复制
       private void tbox_PreviewDragEnter(object sender, DragEventArgs e)
    {
        if (sender == e.Source)
        {
            e.Effects = DragDropEffects.None;
        }

    }

但还是不能工作。

我将在这里添加我使用的DragAdorner.cs (我是从一些中文网站上获得的):

代码语言:javascript
复制
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;
EN

回答 3

Stack Overflow用户

发布于 2016-10-03 21:23:46

IsHitTestVisible = false;

票数 3
EN

Stack Overflow用户

发布于 2013-08-05 19:59:53

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

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

MSDN上的Drag and Drop Overview页面上有一些代码示例,应该也会对您有所帮助。Enabling an Element to be a Drop Target部分包含示例代码,其中显示了我所描述的内容。

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

票数 0
EN

Stack Overflow用户

发布于 2016-03-04 18:28:04

用Point(-5,-5)初始化你的Dragadorner。(new DragAdorner(new Point(-5,-5);)

drop事件似乎在Adorner上抛出。如果你在Adorner中添加了一个拖放处理程序,你会看到当你释放鼠标时,它会被调用。

鼠标指针似乎在装饰器上,它将其作为目标。

将偏移量设置为Point,以便Adorner不在Mousepointer下,可以更正该行为。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18053832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档