微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Silverlight 不同控件与TreeView本身的相关拖动

最近在做SL的拖动,然后使用了SL toolkit提供的控件,感觉并不是很好,不能实现我需要的功能,比如拖动时的复制增加,TreeView首选项不能拖动等,还有不能在childwindows里面使用这种拖动控件,所以自己写了一个TreeView 拖动的代码

    有一个效果截图给大家看下:

 

   下面是XAML方面的代码:当然如果右边的控件不为listBox的话,换成别的控件也是可以的。

    <Canvas x:Name="LayoutRoot" AllowDrop="True"
            MouseLeftButtonUp="LayoutRoot_MouseLeftButtonUp"
            MouseMove="LayoutRoot_MouseMove">
        <!--这个是左边的ListBox,鼠标将从此ListBox拖出图标-->
        <ListBox Name="listBox1" Background="AliceBlue" Width="100" 
                     HorizontalAlignment="Left" VerticalAlignment="Top" 
                     Height="550" >
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <Border BorderThickness="1">
                            <TextBlock  Text="{Binding IcoConcent}"
                                   Height="15" Margin="0,5,6,0"
                                   Tag="{Binding IcoName}"
                                   MouseLeftButtonDown="Image_MouseLeftButtonDown"
                                   HorizontalAlignment="Center"></TextBlock>
                        </Border>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate> 
        </ListBox>
        <!--这个在鼠标拖动过程中显示的图标-->
        <TextBlock Name="tab" Opacity="0.5" Width="30" Height="30"
            Margin="0,0" Visibility="Collapsed"  HorizontalAlignment="Center" />

        <sdk:TreeView Name="treDetail" Margin="200 0 0 0" Background="AliceBlue"  Height="550" Width="300" >
                <toolkit:ContextMenuService.ContextMenu>
                    <toolkit:ContextMenu Name="ContextMenu1">
                        <toolkit:MenuItem Header="{StaticResource Delete}"  Name="treiDelete"  x:FieldModifier="public"/>
                    </toolkit:ContextMenu>
                </toolkit:ContextMenuService.ContextMenu>
         </sdk:TreeView>

下面是后台代码: 这边最重要的就是VisualTreeHelper.FindElementsInHostCoordinates类 他获得了鼠标移动到treeview 上需要的treeviewitem。

        ' 标示是否按下鼠标左键
        Private leftMouseflag As Boolean = False

        ' 右边ListBox的结果集合
          Private Sub Image_MouseLeftButtonDown(ByVal sender As Object,ByVal e As MouseButtonEventArgs)
            '鼠标在ListBox中按下准备拖出图片的时候,设置leftMouseflag为true,并且设置Image为可见
            leftMouseflag = True
            Dim _textBox As TextBlock = TryCast(sender,TextBlock)
            Dim _point As Point = e.GetPosition(_textBox)

            Me.tab.Text = _textBox.Text
            Me.tab.Tag = _textBox.Tag
            Me.tab.SetValue(Canvas.LeftProperty,_point.X)
            Me.tab.SetValue(Canvas.TopProperty,_point.Y - 5)
            Me.tab.Visibility = Visibility.Visible
        End Sub
        Private Sub LayoutRoot_MouseLeftButtonUp(ByVal sender As Object,ByVal e As MouseButtonEventArgs)

            '如果得知鼠标左键松动的位置是右边的ListBox上时则为右边的ListBox添加一列
            Dim point As Point = e.GetPosition(LayoutRoot)


            If point.X > 200 AndAlso point.X < 500 AndAlso point.Y < 650 AndAlso leftMouseflag = True Then
                    If listBox1.SelectedItem IsNot nothing Then
                        Me.tab.Visibility = Visibility.Collapsed
                        Dim returnValue As IEnumerable(Of UIElement)
                        returnValue = VisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition(nothing),treDetail)

                        For Each _r As Object In returnValue
                            If _r.ToString = "System.Windows.Controls.TreeViewItem" Then
                                p_ingteger = p_ingteger + 1
                                Dim _tre As New TreeViewItem
                                _tre.Header = Me.tab.Text
                                 _tre.IsExpanded = True
                                _r.Items.Add(_tre)
                                Exit For
                            End If
                        Next
                        listBox1.SelectedItem = nothing
                        leftMouseflag = False
                End If
            Else
                Me.tab.Visibility = Visibility.Collapsed
                leftMouseflag = False
            End If
        End Sub
        Private Sub LayoutRoot_MouseMove(ByVal sender As Object,ByVal e As MouseEventArgs)
            '让图片跟随鼠标的移动而移动
            Dim _point As Point = e.GetPosition(sender)
            Me.tab.SetValue(Canvas.LeftProperty,_point.Y - 5)
        End Sub

关于treeview 内部的拖动 我想可以根据treeview.selecteditem或的鼠标的焦点 然后判断它是否移动出treeviewitem的范围来确定它是否在treeview控件做过拖动行为。另外 这是小弟第一次写博客,没有写好的地方请大家多多包涵,另外有什么这方面的问题或者建议也可以告诉我,有什么优化拖动的办法请告诉小弟,小弟在此感激不尽。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐