簡體   English   中英

TranslateTransform用於在Silverlight中拖放

[英]TranslateTransform for drag and drop in Silverlight

我們正試圖在Silverlight(3)中實現拖放。 我們希望用戶能夠將元素從樹視圖拖動到UI的另一部分。 父元素是一個Grid,我們一直在嘗試使用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

拖動的項目跟隨鼠標移動,但顯着偏移。 知道我做錯了什么以及如何糾正它?

事實證明我應該設置保證金而不是使用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() 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM