1、RadTreeView是Telerik公司提供的控件,與之對應的也有SL平台下的控件,使用方法跟Silverlight ToolKit中的TreeView中使用的HierarchicalDataTemplate類似,可以實作多級遞歸。
2、添加命名空間引用
3、添加資源引用
<UserControl.Resources>
<DataTemplate x:Key="V_Site">
<TextBlock Text="{Binding S_Name}" />
</DataTemplate>
<!--ItemTemplate="{StaticResource Team}"添加的是上面的id-->
<telerik2:HierarchicalDataTemplate x:Key="V_Region" ItemTemplate="{StaticResource V_Site}"
ItemsSource="{Binding V_Sites}">
<TextBlock Text="{Binding R_Name}" />
</telerik2:HierarchicalDataTemplate>
</UserControl.Resources>
3、控件添加
<telerik:RadTreeView x:Name="RadTreeView1"
SelectionMode="Extended" IsLineEnabled="True" IsExpandOnSingleClickEnabled="True"
ItemsOptionListType="None" IsOptionElementsEnabled="True"
IsRootLinesEnabled="True" IsTriStateMode="True" Selected="RadTreeView1_Selected" FontSize="14.667" Foreground="#FF0A539D" FontFamily="Microsoft YaHei" Canvas.ZIndex="1"
ItemsSource="{Binding SiteTypesDataSource}"
ItemTemplate="{StaticResource V_Region}" Grid.Row="2" Margin="33,6,25,5" />
4、幾個類 Item_Collection_DistinctBy_VID.cs、V_Site.cs、V_Region.cs,分别如下:
public class Item_Collection_DistinctBy_VID : IEqualityComparer<Video>
{
public bool Equals(Video p1, Video p2)
{
if (p1 == null)
return p2 == null;
return p1.REGIONNM == p2.REGIONNM;
}
public int GetHashCode(Video p)
if (p == null)
return 0;
return p.REGIONNM.GetHashCode();
}
public class V_Site
public V_Site(string name, string code, double lgtd, double lttd)
this.S_Name = name;
this.S_Code = code;
this.S_LGTD = lgtd;
this.S_LTTD = lttd;
public string S_Code { get; set; } //站點編碼
public string S_Name { get; set; } //站點名稱
public double S_LGTD { get; set; } //經度
public double S_LTTD { get; set; } //緯度
}
public class V_Region
public V_Region(string name, string code)
this.R_Name = name;
this.R_Code = code;
this.V_Sites = new ObservableCollection<V_Site>();
public string R_Name { get; set; } //地區名稱
public string R_Code { get; set; } //地區編碼
public ObservableCollection<V_Site> V_Sites { get; set; } //站點類型
5、資料綁定
#region 樹狀綁定事件,使用LINQ來處理一次性擷取的資料,然後綁定到RadTreeView中
public ObservableCollection<V_Region> SiteTypesDataSource { get; set; }
V_Region l;
/// <summary>
/// 根據站點類型和地區類型,擷取站點資訊
/// </summary>
/// <param name="type"></param>
/// <param name="region"></param>
private void InitializeDataSource()
this.SiteTypesDataSource = new ObservableCollection<V_Region>();
getMapDataSoapClient client = new getMapDataSoapClient();
client.getAllSPSitesCompleted += new EventHandler<getAllSPSitesCompletedEventArgs>(client_getAllSPSitesCompleted);
client.getAllSPSitesAsync();
void client_getAllSPSitesCompleted(object sender, getAllSPSitesCompletedEventArgs e)
ObservableCollection<Video> lists = e.Result;
var tempSTTP = lists.Distinct(new Item_Collection_DistinctBy_VID()).ToList(); //不同的地區
foreach (Video sttp in tempSTTP)
{
this.SiteTypesDataSource.Add(l = new V_Region(sttp.REGIONNM, sttp.VIDEOID));
List<Video> rets = (from li in lists
where li.REGIONNM == sttp.REGIONNM
select li
).ToList<Video>();
foreach (Video item in rets)
{
l.V_Sites.Add(new V_Site(item.SITENM, item.VIDEOID, item.LGTD, item.LTTD));
}
}
this.RadTreeView1.ItemsSource = SiteTypesDataSource;
this.RadTreeView1.ExpandAll();
#endregion
6、點選TreeView節點,進行站點定位聚焦
//選中時動态綁定
private void RadTreeView1_Selected(object sender, Telerik.Windows.RadRoutedEventArgs e)
RadTreeView source = sender as RadTreeView;
try
if (source.SelectedItem is MapClient.TreeClass.V_Region)
//地區
return;
if (source.SelectedItem is V_Site)
//站點
V_Site s = source.SelectedItem as V_Site;
Graphic g = new Graphic()
{
Geometry = mercator.FromGeographic(new MapPoint(double.Parse(s.S_LGTD.ToString()), double.Parse(s.S_LTTD.ToString()))),
Symbol = LayoutRoot.Resources["DefaultMarkerSymbol"] as Symbol
};
ESRI.ArcGIS.Client.Geometry.Envelope selectedFeatureExtent = mercator.ToGeographic(g.Geometry).Extent; //選中點的位置
double expandPercentage = 2;
//加數值後,聚焦(這裡需要注意,進行地理坐标和墨卡托坐标的轉換 2013-01-29 張大偉)
double widthExpand = (selectedFeatureExtent.Width + 5) * (expandPercentage / 100);
double heightExpand = (selectedFeatureExtent.Height + 5) * (expandPercentage / 100);
ESRI.ArcGIS.Client.Geometry.Envelope displayExtent = new Envelope(WKIDConvert.lonlat2mercator(new MapPoint(selectedFeatureExtent.XMin - (widthExpand / 2), selectedFeatureExtent.YMin - (heightExpand / 2))), WKIDConvert.lonlat2mercator(new MapPoint(selectedFeatureExtent.XMax + (widthExpand / 2), selectedFeatureExtent.YMax + (heightExpand / 2))))
SpatialReference = new SpatialReference(102100)
try
//聚焦
myMap.ZoomTo(displayExtent);
ShowFocus(g);
}
catch (Exception)
catch (Exception ex)
return;
7、效果如下圖:
