代码之家  ›  专栏  ›  技术社区  ›  fuzzyman

用于在Silverlight中拖放的TranslateTransform

  •  3
  • fuzzyman  · 技术社区  · 16 年前

    我们正在尝试在Silverlight(3)中实现拖放。我们希望用户能够将元素从TreeView拖到UI的另一部分。父元素是一个网格,我们一直在尝试使用translateTransform以及mouseLeftButtonDown、mouseMove(等等)事件,正如各种在线示例所推荐的那样。例如:

    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方法由mouseLeftButtonDown事件触发(在treeviewItem.header中的textBlock上)。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
    

    拖动的项跟随鼠标移动,但偏移量很大。知道我做错了什么,怎么改正吗?

    1 回复  |  直到 16 年前
        1
  •  0
  •   fuzzyman    16 年前

    因此,我本应该设置边界而不是使用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()