2010-03-22 63 views
3

我們正試圖在Silverlight(3)中實現拖放操作。我們希望用戶能夠將樹形視圖中的元素拖放到UI的另一部分。父元素是一個Grid,我們一直在嘗試使用TranslateTransform以及MouseLeftButtonDown,MouseMove(etc)事件,正如各種在線示例所推薦的。例如:用於在Silverlight中拖放的TranslateTransform

http://www.85turns.com/2008/08/13/drag-and-drop-silverlight-example/

我們在IronPython中這樣做,但應該是或多或少無關。拖動開始正確啓動,但拖動的項目出現在'錯誤'的位置(從光標向右和向下偏移幾百個像素),我不能爲我的生活找出原因。

基本XAML:

<Grid x:Name="layout_root"> 
    <Grid.RowDefinitions> 
     <RowDefinition/> 
     <RowDefinition Height="120"/> 
    </Grid.RowDefinitions> 
    <Border x:Name="drag" Background="LightGray" Width="40" Height="15" 
    Visibility="Collapsed" Canvas.ZIndex="10"> 
     <Border.RenderTransform> 
      <TranslateTransform x:Name="transform" X="0" Y="0" /> 
     </Border.RenderTransform>    
     <TextBlock x:Name="dragText" TextAlignment="Center" 
     Foreground="Gray" Text="foo" /> 
    </Border> 
    ... 
</Grid> 

所述的startDrag方法由(在TreeViewItem.Header上一個TextBlock)MouseLeftButtonDown事件觸發。 onDrag由MouseMove觸發。在下面的代碼self.root是Application.Current.RootVisual(從App.xaml中頂層UI元素):

def startDrag(self, sender, event): 
    self.root.drag.Visibility = Visibility.Visible 
    self.root.dragText.Text = sender.Text 
    position = event.GetPosition(self.root.drag.Parent) 

    self.root.drag.transform.X = position.X 
    self.root.drag.transform.Y = position.Y 

    self.root.CaptureMouse() 
    self._captured = True 

def onDrag(self, sender, event): 
    if self._captured: 
     position = event.GetPosition(self.root.drag.Parent) 
     self.root.drag.transform.X = position.X 
     self.root.drag.transform.Y = position.Y 

拖動的項目跟隨鼠標移動,但被顯着偏離。任何想法我做錯了什麼,以及如何糾正?

回答

0

所以,事實證明,我應該已經設置了保證金,而不是使用TranslateTransform:

def startDrag(self, sender, event): 
    self.root.drag.Visibility = Visibility.Visible 
    self.root.dragText.Text = sender.Text 

    self.root.CaptureMouse() 
    self._captured = True 
    self.root.MouseLeftButtonUp += self.stopDrag 
    self.root.MouseLeave += self.stopDrag 
    self.onDrag(sender, event) 

def onDrag(self, sender, event): 
    if self._captured: 
     position = event.GetPosition(self.root.layout_root) 
     self.root.drag.Margin = Thickness(position.X, position.Y, 0, 0) 
     self.root.drag.UpdateLayout()