2008-12-17 61 views
4

我想在双击列表框中的某个项目时创建视觉效果。到目前为止,我已经通过拖放功能将项目可视化地连接到鼠标并可以移动到放置目标。从该功能中,我可以使用获取物品容器的相同逻辑来动画物品,但是我无法离开物品控制。有什么办法从列表框中移除项目并将其可视化地移动到另一个位置?基本上主要的列表框是一张牌。当双击卡片时,我希望它从手形列表框中可视化地移动到放弃列表框。到目前为止,将项目从一个集合移动到另一个集合的逻辑没有问题,但是我真的很喜欢这个事件的动画视觉表示。任何想法或参考如何做这样的事情将不胜感激。将ListBoxItem从一个ListBox动画到另一个ListBox

感谢, 布兰登

什么我试图进一步了解详细: 有,我还没有一个的又一强抓,这导致我先运行到面对这堵墙的一些概念。我有一个方法,我传入(有些可能是不必要的)ListBox作为一个ItemsControl,一个FrameworkElement是列表框项目,和与ListBox项目相关联的数据对象。我试图做的是一个画布的ListBoxItem的FindVisualChild。我可以做到这一点。在我看来,我想要以某种方式将画布克隆为画布或位图,将其添加到页面的子项的子项中,从ListBox中移除ListBoxItem,并将该克隆动画化为放弃桩。当动画完成时,克隆将被删除或隐藏,并且当该对象被添加到丢弃堆集时,它将有效地取代克隆。

我的问题是,我觉得真的有一个更简单的方法来做到这一点,使用装饰层或什么。我也不知道如何将克隆放置在视觉树上的元素的完全相同位置。我将继续努力并研究其他方法,我只希望有人会分享一些关于此的见解。

+0

可能要明确提到你在谈论WPF - 标记不够。 – bhollis 2008-12-30 23:33:11

+0

这可能不会完全帮助你,但作为一个想法可能会帮助你。 (http://bea.stollnitz.com/blog/?p = 53) – 2009-01-06 10:28:26

回答

1

下面是一些代码,我将其绘制为位图。您可能可以根据您的需要进行调整,并通过装饰代表两个列表视图的共同祖先的UIElement来绘制位图。请注意使用FrameworkElement.TransformToAncestor根据祖先元素获取嵌套元素的坐标。

 public static BitmapSource CreateBitmapFromElement(FrameworkElement element, Double dpiX, Double dpiY) 
     { 
      Size elementSize = new Size(element.ActualWidth, element.ActualHeight); 
      Visual root = GetAdornerDecoratorAncestor(element); 
      Rect elementBounds = element.TransformToAncestor(root).TransformBounds(new Rect(elementSize)); 

      RenderTargetBitmap rtb = new RenderTargetBitmap((Int32)(elementBounds.Size.Width * dpiX/96.0), 
              (Int32)(elementBounds.Size.Height * dpiY/96.0), 
              dpiX, 
              dpiY, 
              PixelFormats.Pbgra32); 

      DrawingVisual dv = new DrawingVisual(); 
      using (DrawingContext dc = dv.RenderOpen()) 
      { 
       VisualBrush vb = new VisualBrush(root); 
       vb.ViewboxUnits = BrushMappingMode.Absolute; 
       vb.Stretch = Stretch.None; 
       vb.Viewbox = elementBounds; 
       dc.DrawRectangle(vb, null, new Rect(new Point(), elementBounds.Size)); 
      } 
      rtb.Render(dv); 
      return rtb; 
     } 

     public static Visual GetAdornerDecoratorAncestor(DependencyObject obj) 
     {    
      while(obj != null && !(obj is AdornerDecorator)) 
      { 
       obj = VisualTreeHelper.GetParent(obj); 
      } 
      return obj as AdornerDecorator; 
     } 
1

好的,你可以尝试一个视觉元素,并将它的背景设置为ListItem的一个可视化刷,并将其设置为另一个列表框的动画。您可以等待storyboard完成的事件来切实执行切换。如果这是我,我会从一个盒子到另一个盒子的边缘生成动画。如果交换机发生的速度足够快,那么用户应该看起来非常无缝。根据任何排序/过滤规则,查找项目应该进入列表框的确切位置将非常复杂。

1

如果两个列表框始终处于相同位置,则可以尝试将双击项目动画化到预定位置,让我们假设旧列表和新列表之间的中间位置。然后执行代码将项目移动到新列表中,但使用立即从该预定位置开始该项目的动画并在新列表中动画化为其位置的样式。您可能必须根据它在列表中插入的位置,在运行时调整新项目的初始偏移量。

相关问题