在silverlight程序中一行代码的疑惑:bj.e clic.cn pointtbj.e clic.cn pointt = e.GetPosition(parentCanvas);

评论-3586&
trackbacks-74
  在Silverlight中自身并没有提供拖放功能的相关实现,要实现拖放功能得借助其事件支持(MouseLeftButtonDown、MouseLeftButtonUp和MouseMove)来完成,实际应用中我们可以通过行为(Behavior)特性将拖放操作封装为行为,这样可达到代码复用的效果。而在Blend中则直接提供了拖放操作行为,它位于Microsoft.Expression.Interactions.dll的Microsoft.Expression.Interactivity.Layout名称空间下。
  Silverlight中的拖放操作通常是使用事件驱动动态定位对象的坐标来实现,首先来看看如何通过代码的可编程方式在Silverlight中实现拖放操作,如下代码块:
private&void&OnMouseLeftButtonDown(object&sender,&MouseButtonEventArgs&e){&&&&FrameworkElement&element&=&sender&as&FrameworkE&&&&MousePosition&=&e.GetPosition(null);&&&&IsMouseCaptured&=&true;&&&&element.CaptureMouse();&&&&element.Cursor&=&Cursors.H}private&void&OnMouseLeftButtonUp(object&sender,&MouseButtonEventArgs&e){&&&&FrameworkElement&element&=&sender&as&FrameworkE&&&&IsMouseCaptured&=&false;&&&&element.ReleaseMouseCapture();&&&&MousePosition.X&=&MousePosition.Y&=&<span style="color: #;&&&&element.Cursor&=&null;}private&void&OnMouseMove(object&sender,&MouseEventArgs&e){&&&&FrameworkElement&element&=&sender&as&FrameworkE&&&&if&(IsMouseCaptured)&&&&{&&&&&&&&double&Y&=&e.GetPosition(null).Y&-&MousePosition.Y;&&&&&&&&double&X&=&e.GetPosition(null).X&-&MousePosition.X;&&&&&&&&X&=&X&+&(double)element.GetValue(Canvas.LeftProperty);&&&&&&&&Y&=&Y&+&(double)element.GetValue(Canvas.TopProperty);&&&&&&&&element.SetValue(Canvas.LeftProperty,&X);&&&&&&&&element.SetValue(Canvas.TopProperty,&Y);&&&&&&&&MousePosition&=&e.GetPosition(null);&&&&}}
  如上定义好的三个方法实现了对象的拖放算法,实际应用中只需要将需要进行拖放移动的对象分别添加MouseLeftButtonDown、MouseLeftButtonUp和MouseMove事件处理就行了。如下示例代码:
attachedElement.MouseLeftButtonDown&+=&(s,&e)&=&&OnMouseLeftButtonDown(s,&e);attachedElement.MouseLeftButtonUp&+=&(s,&e)&=&&OnMouseLeftButtonUp(s,&e);attachedElement.MouseMove&+=&(s,&e)&=&&OnMouseMove(s,&e);
  按照常规做法我们会将以上相关方法的实现封装为一个基类以达到复用的目的,但本文不推荐使用基类去封装拖放行为,因为Silverlight有专门用于处理对象行为的特性-Behaviors。在Silverlight中System.Windows.Interactivity命名空间下提供了行为的基础框架,我们可以进行自由的扩展行为以实现自己的不同需求。安装Blend后可以在安装目录下找到Microsoft.Expression.Interactivity.dll这个库,这个库提供了一些比较常用的集中行为扩展,在Blend中通过&#8220;窗口&#8221;--&#8220;资产&#8221;打开资产面板,选择行为资产就可以查看到Silverlight 3中所提供的扩展行为,如下图: 
        &
  我们可以将上面实现对象拖放的功能封装为行为以达到代码复用,在Blend中通过&#8220;文件&#8221;--&#8220;新建&#8221;菜单项可打开新建对象对话框。
        
  Blend新建向导创建的行为提供了一套行为模板,如下代码块:
public&class&Behavior1&:&Behavior&DependencyObject&{&&&&public&Behavior1()&&&&{&&&&&&&&//&在此点下面插入创建对象所需的代码。&&&&&&&&//&&&&&&&&//&下面的代码行用于在命令&&&&&&&&//&与要调用的函数之间建立关系。如果您选择&&&&&&&&//&使用&MyFunction&和&MyCommand&的已注释掉的版本,而不是创建自己的实现,&&&&&&&&//&请取消注释以下行并添加对&Microsoft.Expression.Interactions&的引用。&&&&&&&&//&&&&&&&&//&文档将向您提供简单命令实现的示例,&&&&&&&&//&您可以使用该示例,而不是使用&ActionCommand&并引用&Interactions&程序集。&&&&&&&&//&&&&&&&&//this.MyCommand&=&new&ActionCommand(this.MyFunction);&&&&}&&&&protected&override&void&OnAttached()&&&&{&&&&&&&&base.OnAttached();&&&&&&&&//&插入要在将&Behavior&附加到对象时运行的代码。&&&&}&&&&protected&override&void&OnDetaching()&&&&{&&&&&&&&base.OnDetaching();&&&&&&&&//&插入要在从对象中删除&Behavior&时运行的代码。&&&&}&&&&/*&&&&public&ICommand&MyCommand&&&&{&&&&&&&&&&&&&&&&private&&&&&}&&&&&&&&&private&void&MyFunction()&&&&{&&&&&&&&//&插入要在从对象中删除&Behavior&时运行的代码。&&&&}&&&&*/}
  要实现自定义行为通过此行为模板进行自我扩展就行了,位于System.Windows.Interactivity中的Behavior提供了将行为或命令进行封装以达到可进行附加到其他的一个对象上,需要注意的是自定义行为默认继承Behavior&DependencyObject&,使用DependencyObject类型的行为是不能访问对象的鼠标事件的,如果要访问鼠标操作的事件,可以使用具体的UI组件类型或者直接使用UI元素基类UIElement。
  下面为将本篇前面实现对象拖放功能的代码进行了行为的封装,完整代码如下:
///&&summary&///&Behavior:封装行为和命令,便于附加到对象中。///&DependencyObject:不能实现访问鼠操作事件///&UIElement:可访问鼠标事件///&&/summary&public&class&DragBehavior&:&Behavior&UIElement&{&&&&private&UIElement&attachedE&&&&private&UserControl&&&&&private&bool&IsMouseC&&&&private&Point&MouseP&&&&protected&override&void&OnAttached()&&&&{&&&&&&&&attachedElement&=&this.AssociatedO&&&&&&&&parent&=&Application.Current.RootVisual&as&UserC&&&&&&&&attachedElement.MouseLeftButtonDown&+=&(s,&e)&=&&OnMouseLeftButtonDown(s,&e);&&&&&&&&attachedElement.MouseLeftButtonUp&+=&(s,&e)&=&&OnMouseLeftButtonUp(s,&e);&&&&&&&&attachedElement.MouseMove&+=&(s,&e)&=&&OnMouseMove(s,&e);&&&&}&&&&private&void&OnMouseMove(object&sender,&MouseEventArgs&e)&&&&{&&&&&&&&FrameworkElement&element&=&sender&as&FrameworkE&&&&&&&&if&(IsMouseCaptured)&&&&&&&&{&&&&&&&&&&&&double&Y&=&e.GetPosition(null).Y&-&MousePosition.Y;&&&&&&&&&&&&double&X&=&e.GetPosition(null).X&-&MousePosition.X;&&&&&&&&&&&&X&=&X&+&(double)element.GetValue(Canvas.LeftProperty);&&&&&&&&&&&&Y&=&Y&+&(double)element.GetValue(Canvas.TopProperty);&&&&&&&&&&&&element.SetValue(Canvas.LeftProperty,&X);&&&&&&&&&&&&element.SetValue(Canvas.TopProperty,&Y);&&&&&&&&&&&&MousePosition&=&e.GetPosition(null);&&&&&&&&}&&&&}&&&&private&void&OnMouseLeftButtonUp(object&sender,&MouseButtonEventArgs&e)&&&&{&&&&&&&&FrameworkElement&element&=&sender&as&FrameworkE&&&&&&&&IsMouseCaptured&=&false;&&&&&&&&element.ReleaseMouseCapture();&&&&&&&&MousePosition.X&=&MousePosition.Y&=&<span style="color: #;&&&&&&&&element.Cursor&=&null;&&&&}&&&&private&void&OnMouseLeftButtonDown(object&sender,&MouseButtonEventArgs&e)&&&&{&&&&&&&&FrameworkElement&element&=&sender&as&FrameworkE&&&&&&&&MousePosition&=&e.GetPosition(null);&&&&&&&&IsMouseCaptured&=&true;&&&&&&&&element.CaptureMouse();&&&&&&&&element.Cursor&=&Cursors.H&&&&}&&&&protected&override&void&OnDetaching()&&&&{&&&&&&&&base.OnDetaching();&&&&}}
  通过行为特性将对象的拖放功能进行封装以达到复用的目的,以上就全部实现了这个功能,测试可通过Ctrol+Shift+B编译项目,然后通过&#8220;资产&#8221;面板就可以发现以上自定义扩展的拖放行为。
        
  使用行为非常简单,打开Blend的资源面板中,选中需要使用的行为,将其拖放到要使用该行为的对象(Blend中设计的界面对象)上就行了。其实在Blend也提供了拖放行为:MouseDragElementBehavior,直接使用这个行为和本篇所介绍的实现达到的是同样的效果。以下为分别使用这两种行为所对应生成的XAML编码:
&UserControl&&&&xmlns="/winfx/2006/xaml/presentation"&&&&xmlns:x="/winfx/2006/xaml"&&&&xmlns:i="clr-namespace:System.Windows.Iassembly=System.Windows.Interactivity"&&&&&xmlns:local="clr-namespace:DragBehavior"&&&&xmlns:il="clr-namespace:Microsoft.Expression.Interactivity.Lassembly=Microsoft.Expression.Interactions"&&&&x:Class="DragBehavior.MainControl"&&&&Width="800"&Height="600"&&&&&&Canvas&x:Name="LayoutRoot"&Background="White"&&&&&&&&&&Rectangle&Fill="#FFFF0000"&Stroke="#FF000000"&Height="100"&Width="100"&Canvas.Left="100"&Canvas.Top="100"&&&&&&&&&&&&&&i:Interaction.Behaviors&&&&&&&&&&&&&&&&&&il:MouseDragElementBehavior/&&&&&&&&&&&&&&/i:Interaction.Behaviors&&&&&&&&&&/Rectangle&&&&&&&&&&Ellipse&Fill="#FF0000FF"&Stroke="#FF000000"&Height="100"&Width="100"&Canvas.Top="219"&Canvas.Left="397"&&&&&&&&&&&&&&i:Interaction.Behaviors&&&&&&&&&&&&&&&&&&local:DragBehavior/&&&&&&&&&&&&&&/i:Interaction.Behaviors&&&&&&&&&&/Ellipse&&&&&&/Canvas&&/UserControl&
  推荐资源:
& 本文属原创文章,欢迎转载且注明文章出处,其版权归作者和博客园共有。&&
& 作&&&&&&者:Beniao
&文章出处:& 或&
阅读(...) 评论()1157人阅读
开发日常的Silverlight应用程序时,常常要对一个域多个控件实现可拖放的MOUSE操作,在Silverlight中实现拖放的功能其实非常简单,但是为了提高程序功能代码的可复用性,程序员常常喜欢把常用的代码封装成一个工具类,例如Asp.net中常用SQLHelper类,用来操作数据库的,这里我们介绍的类是在Silverlight中实现拖动的工具类,它支持Silverlight2.0至Silverlight4.0的各个版本通用,好了话不多说,我们还是看代码吧:
public static class DragDrop
private static bool IsDragging = false;
private static Point curP
private const int MAX_ZINDEX = 99999;
private const double CURRENT_OPACITY = 0.5;
private static int lastZI
private static double lastO
private static void sender_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
UIElement uiElement = sender as UIE
if (uiElement != null)
uiElement.CaptureMouse();
lastZIndex = (int)uiElement.GetValue(Canvas.ZIndexProperty);
uiElement.SetValue(Canvas.ZIndexProperty, MAX_ZINDEX);
lastOpacity = uiElement.O
uiElement.Opacity = CURRENT_OPACITY;
IsDragging = true;
curPoint = new Point(e.GetPosition(null).X, e.GetPosition(null).Y);
private static void sender_MouseMove(object sender, MouseEventArgs e)
if (!IsDragging)
UIElement uiElement = sender as UIE
if (uiElement != null)
double currentLeft = (double)uiElement.GetValue(Canvas.LeftProperty);
double currentTop = (double)uiElement.GetValue(Canvas.TopProperty);
double newLeft = (double)currentLeft + e.GetPosition(null).X - curPoint.X;
double newTop = (double)currentTop + e.GetPosition(null).Y - curPoint.Y;
uiElement.SetValue(Canvas.LeftProperty, newLeft);
uiElement.SetValue(Canvas.TopProperty, newTop);
curPoint = new Point(e.GetPosition(null).X, e.GetPosition(null).Y);
private static void sender_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
UIElement uiElement = sender as UIE
if (uiElement != null)
uiElement.ReleaseMouseCapture();
IsDragging = false;
uiElement.SetValue(Canvas.ZIndexProperty, lastZIndex);
uiElement.Opacity = lastO
public static void Load(UIElement sender)
sender.MouseLeftButtonDown += new MouseButtonEventHandler(sender_MouseLeftButtonDown);
sender.MouseLeftButtonUp += new MouseButtonEventHandler(sender_MouseLeftButtonUp);
sender.MouseMove += new MouseEventHandler(sender_MouseMove);
public static void UnLoad(UIElement sender)
sender.MouseLeftButtonDown -= new MouseButtonEventHandler(sender_MouseLeftButtonDown);
sender.MouseLeftButtonUp -= new MouseButtonEventHandler(sender_MouseLeftButtonUp);
sender.MouseMove -= new MouseEventHandler(sender_MouseMove);
DragDrop工具类的使用方法:
DragDrop.Load(LayoutRoot);
DragDrop是一个静态类,使用起来非常简单,以上只要一行代码就可以实现对Grid控件的拖放操作了。
希望对大家有所帮助~!
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:708715次
积分:11847
积分:11847
排名:第404名
原创:356篇
转载:152篇
评论:993条前面说了一下Activity控件
现在说一下ArrowLine画线控件
ArrowLine可以分为三部分:箭头、线、箭尾组成。
当点击Activity里面圆时,线就出来了,然后拖动,将箭头指向目标Activity控件里去
然后松开鼠标,这样一根线就画出来了。
如图所示:
当拖动开始节点Activity控件时,线的尾部坐标也得修改相应的坐标,同里当拖动结束节点Activity的时候,箭头的坐标也得及时更新位置
当不想要线的时候,可以点击线的右键,然后将线删除。
ArrowLine控件的xaml描述如下:
x:Name=&LayoutRoot& Background=&White&&
&Line x:Name=&Cap&&
&Line.RenderTransform&
&RotateTransform x:Name=&CapRotateTransform& /&
&/Line.RenderTransform&
&Line x:Name=&Connector& /&
&Line x:Name=&Foot&&
&Line.RenderTransform&
&RotateTransform x:Name=&FootRotateTransform& /&
&/Line.RenderTransform&
&TextBox Name=&txtComment& Visibility=&Collapsed& Text=&请输入说明...& TextWrapping=&Wrap& AcceptsReturn=&True& VerticalScrollBarVisibility=&Auto& HorizontalScrollBarVisibility=&Auto& /&
&/Canvas &
ArrowLine控件的cs代码如下:
下面里的代码有从网上摘出来的,修改了一下。
public partial class ArrowLine : UserControl, IArrowLine
/// &summary&
/// 删除箭头
/// &/summary&
public event RoutedEventHandler DeleteL
Point startP
Point endP
/// &summary&
/// 右键菜单
/// &/summary&
ContextMenu _Cmenu = new ContextMenu();
string _LineG
/// &summary&
/// 线的GUID值
/// &/summary&
public string LineGuid { get { return _LineG } set { _LineGuid = } }
/// &summary&
/// 箭头尾部所在的控件
/// &/summary&
public UIElement ArrowFootControl { }
/// &summary&
/// 箭头头部所在的控件
/// &/summary&
public UIElement ArrowCapControl { }
/// &summary&
/// 开始坐标
/// &/summary&
public Point StartPoint
get { return startP }
startPoint =
/// &summary&
/// 结束坐标
/// &/summary&
public Point EndPoint
get { return endP }
endPoint =
public ArrowLine()
InitializeComponent();
MenuItem mi = new MenuItem();
mi.Click += new RoutedEventHandler(mi_Click);
mi.Header = &删除&;
mi.Tag = &delete&;
_Cmenu.Items.Add(mi);
_Cmenu.Visibility = System.Windows.Visibility.C
mi = new MenuItem();
mi.Click += new RoutedEventHandler(mi_Click);
mi.Header = &说明&;
mi.Tag = &Comment&;
_Cmenu.Items.Add(mi);
this.MouseRightButtonDown += new MouseButtonEventHandler(ArrowLine_MouseRightButtonDown);
this.txtComment.LostFocus += new RoutedEventHandler(txtComment_LostFocus);
this.LayoutRoot.Children.Add(_Cmenu);
void txtComment_LostFocus(object sender, RoutedEventArgs e)
if (txtComment.Text.IsNullOrEmpty() || txtComment.Text.Equals(&请输入说明...&))
txtComment.Visibility = System.Windows.Visibility.C
txtComment.IsEnabled =
void ArrowLine_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
e.Handled =
var p = e.GetPosition(sender as UIElement);
Canvas.SetLeft(_Cmenu, p.X);
Canvas.SetTop(_Cmenu, p.Y);
_Cmenu.Visibility = System.Windows.Visibility.V
void mi_Click(object sender, RoutedEventArgs e)
MenuItem mi = sender as MenuI
string state = mi.Tag.ToString();
switch (state)
case &delete&:
if (null != DeleteLine)
DeleteLine(this, e);
case &Comment&:
txtComment.IsEnabled =
txtComment.Visibility = System.Windows.Visibility.V
_Cmenu.Visibility = System.Windows.Visibility.C
/// &summary&
/// 结构函数
/// &/summary&
/// &param name=&startPoint&&开始坐标&/param&
/// &param name=&endPoint&&结束坐标&/param&
public ArrowLine(Point startPoint, Point endPoint)
this.startPoint = startP
this.endPoint = endP
/// &summary&
/// &/summary&
private void Update()
double angleOfLine = Math.Atan2((endPoint.Y - startPoint.Y), (endPoint.X - startPoint.X)) * 180 / Math.PI;
Connector.X1 = startPoint.X;
Connector.Y1 = startPoint.Y;
Connector.X2 = endPoint.X;
Connector.Y2 = endPoint.Y;
Connector.StrokeThickness = 1;
Connector.Stroke = new SolidColorBrush(Colors.Black);
Cap.X1 = (startPoint.X + endPoint.X) / 2;
Cap.Y1 = (startPoint.Y + endPoint.Y) / 2;
Cap.X2 = (startPoint.X + endPoint.X) / 2;
Cap.Y2 = (startPoint.Y + endPoint.Y) / 2;
Cap.StrokeEndLineCap = PenLineCap.T
Cap.StrokeThickness = 20;
Cap.Stroke = new SolidColorBrush(Colors.Black);
CapRotateTransform.Angle = angleOfL
CapRotateTransform.CenterX = (this.StartPoint.X + this.endPoint.X) / 2;
CapRotateTransform.CenterY = (this.StartPoint.Y + this.endPoint.Y) / 2;
Foot.X1 = endPoint.X;
Foot.Y1 = endPoint.Y;
Foot.X2 = endPoint.X;
Foot.Y2 = endPoint.Y;
Foot.StrokeEndLineCap = PenLineCap.T
Foot.StrokeThickness = 20;
Foot.Stroke = new SolidColorBrush(Colors.Black);
FootRotateTransform.Angle = angleOfL
FootRotateTransform.CenterX = this.EndPoint.X;
FootRotateTransform.CenterY = this.EndPoint.Y;
Canvas.SetLeft(txtComment, (this.endPoint.X + this.startPoint.X) / 2);
Canvas.SetTop(txtComment, (this.endPoint.Y + this.startPoint.Y) / 2);
/// &summary&
/// 释放内存
/// &/summary&
public void Dispose()
foreach (var v in _Cmenu.Items)
MenuItem mi = v as MenuI
if (null == mi)
mi.Click -= mi_C
this.MouseRightButtonDown -= ArrowLine_MouseRightButtonD
this.txtComment.LostFocus -= txtComment_LostF
/// &summary&
/// 导出描述线信息
/// &/summary&
/// &returns&&/returns&
public string ExportLocation()
ArrowLineInfo ail = new ArrowLineInfo();
ail.Type = this.GetType().N
ail.Name = this.N
ail.Guid = this.LineG
ail.StartX = StartPoint.X;
ail.StartY = StartPoint.Y;
ail.EndX = EndPoint.X;
ail.EndY = EndPoint.Y;
var aa = ail.ToXElement(&ArrowLine&);
return aa.ToString();
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:239591次
积分:3258
积分:3258
排名:第4151名
原创:146篇
转载:39篇
评论:38条
(1)(2)(3)(1)(5)(3)(3)(8)(2)(3)(2)(4)(1)(2)(3)(30)(9)(6)(2)(1)(2)(5)(1)(5)(1)(10)(8)(5)(4)(8)(12)(26)(6)(1)1.地图的加载
arcgis server for silverlight 通过控件map实现地图的浏览功能。map控件的使用方法如下:
&esri:Map x:Name="MyMap" WrapAround="True" IsLogoVisible="False" Extent="-0,8000000"
MouseMove="MyMap_MouseMove" Progress="MyMap_Progress"
ExtentChanged="MyMap_ExtentChanged"&
&esri:ArcGISTiledMapServiceLayer ID="MyBaseLayer"
Url="/ArcGIS/rest/services/World_Street_Map/MapServer"&
&/esri:ArcGISTiledMapServiceLayer&
&esri:ArcGISTiledMapServiceLayer ID="Imagery" Visible="False"
Url="/ArcGIS/rest/services/World_Imagery/MapServer" /&
&esri:ArcGISDynamicMapServiceLayer ID="MyDynamicLayer"
Url="/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer"&
&/esri:ArcGISDynamicMapServiceLayer&
&/esri:Map&
在Map对象是地图的容器,在其中可以添加自己需要的地图图层。ArcGISTitleMapServerLayer,可以加载网上在线的地图。ArcgisDinamicLayer可以加载本地的地图。Extent 可以设置地图初始化加载的范围。
2.要素图层的聚合和MapTip
API提供了对图层要素的聚合,还有MapTip功能
&esri:FeatureLayer ID="MyFeatureLayer" IgnoreServiceScaleRange="True"
Url="/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer/0"&
//图层聚合
&esri:FeatureLayer.Clusterer&
&esri:FlareClusterer&&/esri:FlareClusterer&
&/esri:FeatureLayer.Clusterer&
&esri:FeatureLayer.MapTip&
&Border CornerRadius="5" BorderBrush="Black" BorderThickness="1" Background="White"&
&TextBlock Text="{Binding [POP2000]}" Foreground="Black" Margin="5"&&/TextBlock&
&/esri:FeatureLayer.MapTip&
&/esri:FeatureLayer&
3.图层控制
API提供了图层控制功能,通过Legend控件。Legend控件可以以树的形式展示图层,但是并不能对图层进行控制,我们需要设置MapLayerTemplate和LayerTemplate,分别为两个模板绑定DataTemplate
&esri:Legend Map="{Binding ElementName=MyMap}"
LayerItemsMode="Tree"
ShowOnlyVisibleLayers="False" Margin="5,5,5,5"&
&esri:Legend.MapLayerTemplate&
&DataTemplate&
&StackPanel Orientation="Horizontal"&
&CheckBox Content="{Binding Label}"
IsChecked="{Binding IsEnabled, Mode=TwoWay}"
IsEnabled="{Binding IsInScaleRange}" &
&/CheckBox&
&/StackPanel&
&/DataTemplate&
&/esri:Legend.MapLayerTemplate&
&esri:Legend.LayerTemplate&
&DataTemplate&
&CheckBox Content="{Binding Label}"
IsChecked="{Binding IsEnabled, Mode=TwoWay}"
IsEnabled="{Binding IsInScaleRange}" &
&/CheckBox&
&/DataTemplate&
&/esri:Legend.LayerTemplate&
&/esri:Legend&
这样一个普通的图层控制工具就有了。
4.LayerAction
API提供了很多LayerAction,下面说说常用的几个LayerAction
距离测量,能够测出要素之间的距离,也称多段线测量,需要地图有空间参考
&Button Style="{StaticResource ResourceKey=MenuItem}" Content="MeasurePolyline"&
&i:Interaction.Triggers&
&i:EventTrigger EventName="Click"&
//定义距离测量
&esri:MeasureAction MeasureMode="Polyline" MapUnits="Meters"
DistanceUnit="Meters" DisplayTotals="True"
TargetName="MyMap"&
&/esri:MeasureAction&
&/i:EventTrigger&
&/i:Interaction.Triggers&
面积测量,能够进行面积的测量。需要地图有空间参考,同时需要设置测量的方式,显示的单位,面积单位等。
&Button Style="{StaticResource ResourceKey=MenuItem}" Content="MeasurePolygon"&
&i:Interaction.Triggers&
&i:EventTrigger EventName="Click"&
&esri:MeasureAction MeasureMode="Polygon" MapUnits="Meters"
DistanceUnit="Meters" AreaUnit="SquareMeters"
TargetName="MyMap" DisplayTotals="True"
FillSymbol="{StaticResource DefaultFillSymbol}"&
&/esri:MeasureAction&
&/i:EventTrigger&
&/i:Interaction.Triggers&
返回全局地图的行为,能够快速返回全局地图
&Button Style="{StaticResource ResourceKey=MenuItem}" Content="ZoomToFullExtent"&
&i:Interaction.Triggers&
&i:EventTrigger EventName="Click"&
&esri:ZoomToFullExtentAction TargetName="MyMap"&&/esri:ZoomToFullExtentAction&
&/i:EventTrigger&
&/i:Interaction.Triggers&
ZoomToLayer。快速定位到指定的图层
&Button Style="{StaticResource ResourceKey=MenuItem}" Content="Zoom To Layer"&
&i:Interaction.Triggers&
&i:EventTrigger EventName="Click"&
&esri:ZoomToLayerAction LayerID="MyFeatureLayer"
TargetName="MyMap"/&
&/i:EventTrigger&
&/i:Interaction.Triggers&
图层控制Toggle行为,能够控制图层的显示,隐藏指定的图层
&Button Style="{StaticResource MenuItem}" Content="Toogle"&
&i:Interaction.Triggers&
&i:EventTrigger EventName="Click"&
&esri:ToggleLayerAction LayerID="MyDynamicLayer" TargetName="MyMap"&
&/esri:ToggleLayerAction&
&/i:EventTrigger&
&/i:Interaction.Triggers&
同时API还能够了显示地图坐标的行为,一般不建议采用。可以自己写代码实现类似的功能。
5.地图坐标的显示
先看前台Xaml代码
&Border BorderBrush="Black" BorderThickness="1" CornerRadius="5"
Background="#DD919191" Width="220" Height="100"
HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,200,0,0"&
&Border.Effect&
&DropShadowEffect ShadowDepth="2"&&/DropShadowEffect&
&/Border.Effect&
&StackPanel Orientation="Vertical" Margin="5" Background="White"&
&TextBlock Text="屏幕坐标"&&/TextBlock&
&StackPanel Orientation="Horizontal"&
&TextBlock Text="X:"&&/TextBlock&
&TextBlock x:Name="txtX"&&/TextBlock&
&TextBlock Text="Y:" Margin="3,0,0,0"&&/TextBlock&
&TextBlock x:Name="txtY"&&/TextBlock&
&/StackPanel&
&StackPanel&
&TextBlock Text="地图坐标"&&/TextBlock&
&/StackPanel&
&StackPanel Orientation="Horizontal"&
&TextBlock Text="X:"&&/TextBlock&
&TextBlock x:Name="MapX"&&/TextBlock&
&TextBlock Margin="3,0,0,0" Text="Y:"&&/TextBlock&
&TextBlock x:Name="MapY"&&/TextBlock&
&/StackPanel&
&/StackPanel&
前台设计坐标的显示,用Textblock显示
private void MyMap_MouseMove(object sender, MouseEventArgs e)
if (MyMap.Extent != null)
System.Windows.Point point = e.GetPosition(MyMap);
txtX.Text = e.GetPosition(MyMap).X.ToString();
txtY.Text = e.GetPosition(MyMap).Y.ToString();
ESRI.ArcGIS.Client.Geometry.MapPoint mapPoint = new ESRI.ArcGIS.Client.Geometry.MapPoint();
mapPoint = MyMap.ScreenToMap(point);
if (MyMap.WrapAroundIsActive)
mapPoint = ESRI.ArcGIS.Client.Geometry.Geometry.NormalizeCentralMeridian(mapPoint) as ESRI.ArcGIS.Client.Geometry.MapP
if (mapPoint != null)
MapX.Text = string.Format("{0}", Math.Round(mapPoint.X, 4));
MapY.Text = string.Format("{0}", Math.Round(mapPoint.Y, 4));
在mouseover事件获取地图的屏幕坐标,通过ScreenToMap 获取地图的坐标。期间需要借助MapPoint实现坐标的从Point转换。使用的时候,需要谨记对象的初始化。
7.获取地图初始化的坐标
有时需要获取地图加载过程中的地图显示范围。通过地图的ExtentChanged事件。
private void MyMap_ExtentChanged(object sender, ExtentEventArgs e)
txtExtent.Text = string.Format("地图范围:\nMinX:{0}\nMinY:{1}\nMaxX:{2}\nMaxY:{3}"
,e.NewExtent.XMin,e.NewExtent.YMin,e.NewExtent.XMax,e.NewExtent.YMax);
8.地图缩放和地图移动的时间设置
通过Api 我们可以设置地图的缩放的时间和地图移动的时间,有时候会有更好的效果。通过Silder控件来实现事件ValueChanged。
private void ZoomAnimation_ValueChanged(object sender, RoutedPropertyChangedEventArgs&double& e)
int seconds = Convert.ToInt32(e.NewValue);
MyMap.ZoomDuration = new TimeSpan(0,0,seconds);
lalZoom.Text = string.Format("value:{0}",seconds);
private void PanAnimation_ValueChanged(object sender, RoutedPropertyChangedEventArgs&double& e)
int sendcons = Convert.ToInt32(e.NewValue);
MyMap.PanDuration = new TimeSpan(0, 0, sendcons);
lalPan.Text = string.Format("Value:{0}",sendcons);
前台代码如下:
&Border BorderBrush="Black" BorderThickness="1" Background="DarkGray" HorizontalAlignment="Right" Margin="0,500,0,0" Height="200"&
&Border.Effect&
&DropShadowEffect&&/DropShadowEffect&
&/Border.Effect&
&StackPanel Orientation="Vertical" Background="White" Margin="5"&
&StackPanel&
&TextBlock Text="设置地图缩放的速度"&&/TextBlock&
&TextBlock Text="Value:0" x:Name="lalZoom"&&/TextBlock&
&Slider x:Name="ZoomAnimation" Minimum="0" Maximum="20" SmallChange="1" LargeChange="5"
Width="200" Cursor="Hand" ValueChanged="ZoomAnimation_ValueChanged"&&/Slider&
&/StackPanel&
&StackPanel&
&TextBlock Text="设置地图移动速度"&&/TextBlock&
&TextBlock Text="Value:0" x:Name="lalPan"&&/TextBlock&
&Slider x:Name="PanAnimation" Minimum="0" Maximum="20" SmallChange="1" LargeChange="5"
Width="200" Cursor="Hand" ValueChanged="PanAnimation_ValueChanged"&&/Slider&
&/StackPanel&
&/StackPanel&
8.地图加载的进度条
当我们需要加载海量的地理信息数据时,地图加载的速度会变慢许多,这时候就需要地图进度条来实时显示地图加载的过程。API为我们提供了MapProcess,
为该控件绑定地图对象即可
&&!--&esri:MapProgressBar Width="150" Map="{Binding ElementName=MyMap}" Height="30"&&/esri:MapProgressBar&--&
也可以使用silverlight的ProcessBar控件来实现。这时需要借助map的process事件。
&ProgressBar Minimum="0" Maximum="100" Width="150" Height="30" x:Name="MyProcess"&&/ProgressBar&
&TextBlock x:Name="txtProcess" Text="100%" HorizontalAlignment="Center" VerticalAlignment="Center"&&/TextBlock&
private void MyMap_Progress(object sender, ProgressEventArgs e)
if (e.Progress & 100)
processGrid.Visibility = Visibility.V
//获取处理的进程
MyProcess.Value = e.P
txtProcess.Text = string.Format("正在加载地图:{0}%", e.Progress);
processGrid.Visibility = Visibility.C
10.图层切换
图层切换其实和图层控制是一个道理,有时候,我们需要切换图层,比如从影像图切换到TitleLayer等。一般通过图层地 Visiable来设置。
&StackPanel Margin="5" Background="White" Orientation="Horizontal"&
//通过radiobutton进行图层切换
&RadioButton x:Name="radImage" Content="卫星影像" Click="radImage_Click"&&/RadioButton&
&RadioButton x:Name="radTitle" Content="矢量地图" Click="radImage_Click"&&/RadioButton&
&/StackPanel&
private void radImage_Click(object sender, RoutedEventArgs e){
//实例化radiobutton控件RadioButton radioButton = sender as RadioB
//radiobutton的name判断switch (radioButton.Name){case"radImage":MyMap.Layers["MyBaseLayer"].Visible =MyMap.Layers["Imagery"].Visible =case"radTitle":
//图层显示MyMap.Layers["MyBaseLayer"].Visible =MyMap.Layers["Imagery"].Visible =}}
阅读(...) 评论()

我要回帖

更多关于 bj.e clic.cn point 的文章

 

随机推荐