概述:最近在做SL的拖動(dòng),然后使用了SL toolkit提供的控件,感覺并不是很好,不能實(shí)現(xiàn)我需要的功能,比如拖動(dòng)時(shí)的復(fù)制增加,TreeView首選項(xiàng)不能拖動(dòng)等,還有不能在 childwindows里面使用這種拖動(dòng)控件,所以自己寫了一個(gè)TreeView 拖動(dòng)的代碼。
最近在做SL的拖動(dòng),然后使用了SL toolkit提供的控件,感覺并不是很好,不能實(shí)現(xiàn)我需要的功能,比如拖動(dòng)時(shí)的復(fù)制增加,TreeView首選項(xiàng)不能拖動(dòng)等,還有不能在childwindows里面使用這種拖動(dòng)控件,所以自己寫了一個(gè)TreeView 拖動(dòng)的代碼。
有一個(gè)效果截圖給大家看下:
下面是XAML方面的代碼:當(dāng)然如果右邊的控件不為listbox的話,換成別的控件也是可以的。
<Canvas x:Name="LayoutRoot" AllowDrop="True"
MouseLeftButtonUp="LayoutRoot_MouseLeftButtonUp"
MouseMove= "LayoutRoot_MouseMove">
<!--這個(gè)是左邊的ListBox,鼠標(biāo)將從此ListBox拖出圖標(biāo)-->
<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>
<!--這個(gè)在鼠標(biāo)拖動(dòng)過(guò)程中顯示的圖標(biāo)-->
<TextBlock Name="tab" Opacity="0.5" Width="30" Height="30"
Margin= "0,5,6,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>
下面是后臺(tái)代碼: 這邊最重要的就是VisualTreeHelper.FindElementsInHostCoordinates類 他獲得了鼠標(biāo)移動(dòng)到treeview 上需要的treeviewitem。
' 標(biāo)示是否按下鼠標(biāo)左鍵
Private leftMouseflag As Boolean = False
' 右邊ListBox的結(jié)果集合
Private Sub Image_MouseLeftButtonDown
(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
'鼠標(biāo)在ListBox中按下準(zhǔn)備拖出圖片的時(shí)候,設(shè)置leftMouseflag為true,并且設(shè)置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)
'如果得知鼠標(biāo)左鍵松動(dòng)的位置是右邊的ListBox上時(shí)則為右邊的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)
'讓圖片跟隨鼠標(biāo)的移動(dòng)而移動(dòng)
Dim _point As Point = e.GetPosition(sender)
Me.tab.SetValue(Canvas.LeftProperty, _point.X)
Me.tab.SetValue(Canvas.TopProperty, _point.Y - 5)
End Sub
關(guān)于treeview 內(nèi)部的拖動(dòng) 我想可以根據(jù)treeview.selecteditem或的鼠標(biāo)的焦點(diǎn) 然后判斷它是否移動(dòng)出treeviewitem的范圍來(lái)確定它是否在treeview控件做過(guò)拖動(dòng)行為。
標(biāo)簽:
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@ke049m.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載