轉(zhuǎn)帖|其它|編輯:郝浩|2011-03-04 13:32:30.000|閱讀 3277 次
概述:來(lái)自微軟的Amit Dey提供了一個(gè)非常好的Sliverlight代碼示例來(lái)展示了在Silverlight中樹(shù)控件的增、刪、改、查和拖放的功能。在 Silverlight社區(qū)里面樹(shù)控件的增、刪、改、查是一個(gè)經(jīng)常被問(wèn)到的問(wèn)題。但是我們收到還是有很多人請(qǐng)求得到這個(gè)代碼示例。我們希望這個(gè)示例能夠使開(kāi)發(fā)人員輕松掌握這個(gè)典型的編程案例。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
來(lái)自微軟的Amit Dey提供了一個(gè)非常好的Sliverlight代碼示例來(lái)展示了在Silverlight中樹(shù)控件的增、刪、改、查和拖放的功能。在Silverlight社區(qū)里面樹(shù)控件的增、刪、改、查是一個(gè)經(jīng)常被問(wèn)到的問(wèn)題。但是我們收到還是有很多人請(qǐng)求得到這個(gè)代碼示例。我們希望這個(gè)示例能夠使開(kāi)發(fā)人員輕松掌握這個(gè)典型的編程案例。
Silverlight TreeView控件的增刪改查
這是一個(gè)Silverlight樹(shù)控件增、刪、改、查操作的示例。除了這個(gè)之外它還支持節(jié)點(diǎn)的拖放功能。這篇文章需要你最少對(duì)Silverlight和數(shù)據(jù)綁定有一點(diǎn)基本的了解。我們最后的輸出效果會(huì)像這樣顯示:
數(shù)據(jù)
首先我們來(lái)看一下要綁定到TreeView控件的數(shù)據(jù)結(jié)構(gòu)
Node是要綁定到每一個(gè)TreeViewItem的類
Text表示節(jié)點(diǎn)上的顯示的數(shù)據(jù)
Children表示節(jié)點(diǎn)的子節(jié)點(diǎn),注意Node類的繼承
System.ComponentModel.INOtifyPropertyChanged類按順序保持UI在異步操作。閱讀這篇文章可以更好的理解這個(gè)功能。
另外注意Add和Delete這兩個(gè)幫助函數(shù),分別用來(lái)添加和刪除節(jié)點(diǎn)。
using System;
using System.ComponentModel;
using System.Collections.ObjectModel;
public class Node : INotifyPropertyChanged
{
private String text;
private ObservableCollection<Node> children;
public event PropertyChangedEventHandler PropertyChanged;
public ObservableCollection<Node> Children
{
get { return children; }
set { children = value; }
}
public String Text
{
get { return text; }
set { text = value; }
}
public Node(String text)
{
Children = new ObservableCollection<Node>();
Text = text;
}
public void Add(Node node)
{
children.Add(node);
NotifyPropertyChanged("Children");
}
public void Delete(Node node)
{
children.Remove(node);
NotifyPropertyChanged("Children");
}
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
XAML
現(xiàn)在我們來(lái)看一下這個(gè)用戶控件的XAML定義
第一步,我實(shí)現(xiàn)了一個(gè)右鍵菜單使增刪改查更容易操作.你可以閱讀這篇文章來(lái)學(xué)習(xí)右鍵菜單如何實(shí)現(xiàn)。
下一步,注意這兩個(gè)HierarchicalDataTemplate,一個(gè)是TreeViewItem 在查看狀態(tài)(TextBlock的變化),另一個(gè)是編輯狀態(tài)(TextBox 的變化),TextBlock和TextBox綁定了Node的Text屬性,我正在使用Silverlight Toolkitr的TreeViewDragDropTarget控件在父節(jié)點(diǎn)之間使用TreeViewItems進(jìn)行拖放。
<UserControl
xmlns:sdk="//schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
x:Class="CSSLTreeViewCRUDDragDrop.TreeViewCrudDragDrop"
xmlns="//schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="//schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="//schemas.microsoft.com/expression/blend/2008"
xmlns:mc="//schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400"
xmlns:toolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Toolkit"
xmlns:mswindows="clr-namespace:Microsoft.Windows;assembly=System.Windows.Controls.Toolkit">
<UserControl.Resources>
<!-- Template for Edit mode of TreeViewItem -->
<sdk:HierarchicalDataTemplate x:Key="TreeViewMainEditTemplate" ItemsSource="{Binding Children}">
<TextBox Text="{Binding Text,Mode=TwoWay}" >
</TextBox>
</sdk:HierarchicalDataTemplate>
<!-- Template for Read mode for TreeViewItem -->
<sdk:HierarchicalDataTemplate x:Key="TreeViewMainReadTemplate"
ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Text,Mode=TwoWay}"
MouseRightButtonDown="TreeViewMain_MouseRightButtonDown"
MouseRightButtonUp="TreeViewMain_MouseRightButtonUp"
MouseLeftButtonDown="TreeViewMain_MouseLeftButtonDown" >
</TextBlock>
</sdk:HierarchicalDataTemplate>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" Background="White">
<!-- TreeViewDragDropTarget from Toolkit to add DragAndDrop feature -->
<toolkit:TreeViewDragDropTarget AllowDrop="True">
<!-- Custom TreeView -->
<sdk:TreeView Name="TreeViewMain"
ItemTemplate="{StaticResource TreeViewMainReadTemplate}"
MouseRightButtonDown="TreeViewMain_MouseRightButtonDown"
MouseRightButtonUp="TreeViewMain_MouseRightButtonUp"
MouseLeftButtonDown="TreeViewMain_MouseLeftButtonDown"
Width="400" Height="400" >
</sdk:TreeView>
</toolkit:TreeViewDragDropTarget>
<!-- Context Menu -->
<Canvas>
<Popup Name="ContextMenu" Visibility="Collapsed">
<Border BorderThickness="1" BorderBrush="Black" Background="White">
<StackPanel>
<HyperlinkButton Content="Add" Name="AddButton" Click="AddButton_Click" />
<HyperlinkButton Content="Edit" Name="EditButton" Click="EditButton_Click"/>
<HyperlinkButton Content="Delete" Name="DeleteButton" Click="DeleteButton_Click"/>
</StackPanel>
</Border>
</Popup>
</Canvas>
</Grid>
</UserControl>
后臺(tái)代碼
現(xiàn)在讓我們先睹為快看一下用戶控件的后臺(tái)代碼:
第一步,鼠標(biāo)的事件處理程序,TreeViewItem的MouseRightButtonUp事件做兩件事情,給選定的節(jié)點(diǎn)selectedNode分派指定的TreeViewItem數(shù)據(jù)上下文。
第二步,彈出右鍵菜單,選中節(jié)點(diǎn)selectedNode的信息是必需的,它作為引用被用來(lái)編輯TreeViewItem、添加子節(jié)點(diǎn)到TreeViewItem和刪除TreeViewItem。
AddButton_Click事件處理程序,創(chuàng)建一個(gè)新的節(jié)點(diǎn)并當(dāng)作節(jié)節(jié)點(diǎn)添加到選中的節(jié)點(diǎn)selecteNode的子節(jié)點(diǎn)下面。
EditButton_Click事件處理程序,改變選中節(jié)點(diǎn)的模板為編輯狀態(tài)
DeleteButton_Click事件處理程序,首先確定TreeViewItem與選中的節(jié)點(diǎn)selectedNode關(guān)聯(lián),查找它的父節(jié)點(diǎn),從父節(jié)點(diǎn)中刪除選中的節(jié)點(diǎn)selectedNode。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Collections.ObjectModel;
namespace CSSLTreeViewCRUDDragDrop
{
public partial class TreeViewCrudDragDrop : UserControl
{
ObservableCollection<Node> objectTree;
Node selectedNode;
public List<Node> Items
{
get
{
return objectTree.ToList<Node>();
}
set
{
objectTree = new ObservableCollection<Node>(value);
TreeViewMain.ItemsSource = objectTree;
}
}
public TreeViewCrudDragDrop()
{
InitializeComponent();
objectTree = new ObservableCollection<Node>();
TreeViewMain.ItemsSource = objectTree;
}
private void TreeViewMain_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
DisableEditForSelectedItem();
e.Handled = true;
}
private void TreeViewMain_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
DisableEditForSelectedItem();
if (sender is TextBlock)
{
selectedNode = (Node)((sender as TextBlock).DataContext);
}
else
{
selectedNode = null;
}
ShowContextMenu(e);
}
private void TreeViewMain_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
DisableEditForSelectedItem();
HideContextMenu();
}
private void AddButton_Click(object sender, RoutedEventArgs e)
{
Node newNode = new Node("New Node");
if (selectedNode != null)
{
selectedNode.Add(newNode);
}
else
{
if (objectTree != null)
{
objectTree.Add(newNode);
}
else
{
objectTree = new ObservableCollection<Node>();
objectTree.Add(newNode);
}
}
HideContextMenu();
}
private void EditButton_Click(object sender, RoutedEventArgs e)
{
EnalbleEditForSelectedItem();
TreeViewItem selectedTreeViewItem =
TreeViewExtensions.GetContainerFromItem(TreeViewMain, selectedNode);
HideContextMenu();
}
private void DeleteButton_Click(object sender, RoutedEventArgs e)
{
TreeViewItem selectedTreeViewItem =
TreeViewExtensions.GetContainerFromItem(TreeViewMain, selectedNode);
if (selectedTreeViewItem != null)
{
TreeViewItem selectedTreeViewItemParent =
TreeViewExtensions.GetParentTreeViewItem(selectedTreeViewItem);
if (selectedTreeViewItemParent != null)
{
Node seleactedParentNode = (Node)selectedTreeViewItemParent.DataContext;
seleactedParentNode.Delete(selectedNode);
}
else
{
objectTree.Remove(selectedNode);
}
}
HideContextMenu();
}
private void ShowContextMenu(MouseButtonEventArgs e)
{
e.Handled = true;
Point p = e.GetPosition(this);
ContextMenu.Visibility = Visibility.Visible;
ContextMenu.IsOpen = true;
ContextMenu.SetValue(Canvas.LeftProperty, (double)p.X);
ContextMenu.SetValue(Canvas.TopProperty, (double)p.Y);
}
private void HideContextMenu()
{
ContextMenu.Visibility = Visibility.Collapsed;
ContextMenu.IsOpen = false;
}
private void EnalbleEditForSelectedItem()
{
if (selectedNode != null)
{
SetTemplateForSelectedItem("TreeViewMainEditTemplate");
}
}
private void DisableEditForSelectedItem()
{
if (selectedNode != null)
{
SetTemplateForSelectedItem("TreeViewMainReadTemplate");
selectedNode = null;
}
}
private void SetTemplateForSelectedItem(String templateName)
{
HierarchicalDataTemplate hdt = (HierarchicalDataTemplate)Resources[templateName];
TreeViewItem selectedTreeViewItem =
TreeViewExtensions.GetContainerFromItem(TreeViewMain, selectedNode);
if (selectedTreeViewItem != null)
selectedTreeViewItem.HeaderTemplate = hdt;
}
}
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@ke049m.cn
文章轉(zhuǎn)載自://www.cnblogs.com/huazai/archive/2011/03/04/1970478.html