我们正在尝试在 Silverlight (3) 中实现拖放。我们希望用户能够将元素从树视图拖动到 UI 的另一部分。父元素是 Grid,我们一直在尝试将 TranslateTransform 与 MouseLeftButtonDown、MouseMove(等)事件一起使用,正如各种在线示例所建议的那样。例如:
http://www.85turns.com/2008/08/13/drag-and-drop-silverlight-example/ 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
拖动的项目跟随鼠标移动,但偏移相当大。知道我做错了什么以及如何纠正吗?