2008-12-17 41 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

如果兩個列表框始終處於相同位置,則可以嘗試將雙擊項目動畫化到預定位置,讓我們假設舊列表和新列表之間的中間位置。然後執行代碼將項目移動到新列表中,但使用立即從該預定位置開始該項目的動畫並在新列表中動畫化爲其位置的樣式。您可能必須根據它在列表中插入的位置,在運行時調整新項目的初始偏移量。

相關問題