【问题标题】:WPF Drag and Drop Source CodeWPF 拖放源代码
【发布时间】:2013-01-08 21:19:17
【问题描述】:

几乎所有关于stackoverflow 处理WPF 中拖放的问题都参考this article。但是,缺少该文章的source code。有人有副本或知道在哪里可以找到副本吗?

附:我主要关心的是文章中的这一行:“DragAdorner 中有更多代码,但主要用于在拖动发生时定位装饰器......请参考示例......”我不知道他是如何放置拖动装饰器。

【问题讨论】:

  • 如果您还没有尝试过,页面上有一个链接可以向博客作者发送电子邮件。
  • 谢谢;我还给作者发了电子邮件。
  • 我使用了那个代码。这真的很麻烦。如果你想实际使用,你必须修复很多细微差别。
  • 啊,也许这是最好的。感谢您的反馈。

标签: c# wpf drag-and-drop adorner


【解决方案1】:

我有一些基于原始系列博客文章的工作代码。完整代码太长,无法在此处发布;我有posted it to PasteBin

DragAdorner中的代码很简单:

internal sealed class DragAdorner : Adorner
{
   private readonly UIElement _child;
   private readonly double _xCenter;
   private readonly double _yCenter;
   private double _leftOffset;
   private double _topOffset;

   public DragAdorner(UIElement owner, UIElement child, bool useVisualBrush, double opacity) : base(owner)
   {
      if (!useVisualBrush)
      {
         _child = child;
      }
      else
      {
         var size = GetRealSize(child);
         _xCenter = size.Width / 2;
         _yCenter = size.Height / 2;

         _child = new Rectangle
         {
            RadiusX = 3,
            RadiusY = 3,
            Width = size.Width,
            Height = size.Height,
            Fill = new VisualBrush(child)
            {
               Opacity = opacity,
               AlignmentX = AlignmentX.Left,
               AlignmentY = AlignmentY.Top,
               Stretch = Stretch.None,
            },
         };
      }
   }

   protected override int VisualChildrenCount
   {
      get { return 1; }
   }

   public double LeftOffset
   {
      get
      {
         return _leftOffset + _xCenter;
      }
      set
      {
         _leftOffset = value - _xCenter;
         UpdatePosition();
      }
   }

   public double TopOffset
   {
      get
      {
         return _topOffset + _yCenter;
      }
      set
      {
         _topOffset = value - _yCenter;
         UpdatePosition();
      }
   }

   private static Size GetRealSize(UIElement child)
   {
      return child == null ? Size.Empty : child.RenderSize;
   }

   public void UpdatePosition(Point point)
   {
      _leftOffset = point.X;
      _topOffset = point.Y;
      UpdatePosition();
   }

   public void UpdatePosition()
   {
      var adorner = Parent as AdornerLayer;
      if (adorner != null) adorner.Update(AdornedElement);
   }

   protected override Visual GetVisualChild(int index)
   {
      if (0 != index) throw new ArgumentOutOfRangeException("index");
      return _child;
   }

   protected override Size MeasureOverride(Size availableSize)
   {
      _child.Measure(availableSize);
      return _child.DesiredSize;
   }

   protected override Size ArrangeOverride(Size finalSize)
   {
      _child.Arrange(new Rect(_child.DesiredSize));
      return finalSize;
   }

   public override GeneralTransform GetDesiredTransform(GeneralTransform transform)
   {
      var result = new GeneralTransformGroup();
      result.Children.Add(new TranslateTransform(_leftOffset, _topOffset));

      var baseTransform = base.GetDesiredTransform(transform);
      if (baseTransform != null) result.Children.Add(baseTransform);

      return result;
   }
}

【讨论】:

    【解决方案2】:

    给作者发了邮件,得到了回复,说他已经没有这篇文章的源代码了。

    【讨论】:

    • 如果你需要的话,我有一些基于原始文章的工作代码。
    • 如果不是太麻烦那就太好了!我设法弄明白了,但其他人可能会偶然发现这个问题。
    【解决方案3】:

    查看 bea stollnitz 的博客

    http://www.zagstudio.com/blog/488#.UQRZCL9fA7X 
    

    当 WPF 相对较新时,这个拖放示例是最早的示例之一。它绝对帮助了我和我的同事......

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2016-10-11
    相关资源
    最近更新 更多