ArcGIS API for Silverlight代码中使用Template模板

简介:        在项目开发中,会遇到点选中聚焦闪烁效果,但是因为在使用Symbol的时候,会设置一定的OffSetX和OffSetY,所以聚焦闪烁的时候,有些情况下,会出现闪烁点的位置和Symbol的位置不重叠现象,下面的方法就是解决这个问题的。

       在项目开发中,会遇到点选中聚焦闪烁效果,但是因为在使用Symbol的时候,会设置一定的OffSetX和OffSetY,所以聚焦闪烁的时候,有些情况下,会出现闪烁点的位置和Symbol的位置不重叠现象,下面的方法就是解决这个问题的。

1、在Silverlight项目中新建一个文件夹Template,新建一个DefaultMarkerSymbol.xaml的Silverlight资源字典文件,如下图:



2、打开DefaultMarkerSymbol.xaml文件,删掉里面的内容,拷贝如下的内容:

<ControlTemplate
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:vsm="clr-namespace:System.Windows;assembly=System.Windows"
    xmlns:esri="http://schemas.esri.com/arcgis/client/2009"
    >
    <Canvas>
        <vsm:VisualStateManager.VisualStateGroups>
            <vsm:VisualStateGroup x:Name="CommonStates">
                <vsm:VisualState x:Name="Normal">
                    <Storyboard RepeatBehavior="Forever">
                        <DoubleAnimation BeginTime="00:00:00" Storyboard.TargetName="ellipse" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleX)" From="1" To="5" Duration="00:00:01" />
                        <DoubleAnimation BeginTime="0:0:0" Storyboard.TargetName="ellipse" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)" From="1" To="5" Duration="00:00:01" />
                        <DoubleAnimation BeginTime="00:00:00" Storyboard.TargetName="ellipse" Storyboard.TargetProperty="(UIElement.Opacity)" From="1" To="0" Duration="00:00:01" />
                    </Storyboard>
                </vsm:VisualState>
            </vsm:VisualStateGroup>
        </vsm:VisualStateManager.VisualStateGroups>
        <Ellipse Height="25" Width="25" Canvas.Left="0" Canvas.Top="0" RenderTransformOrigin="0.5,0.5" x:Name="ellipse" IsHitTestVisible="False">
            <Ellipse.RenderTransform>
                <ScaleTransform />
            </Ellipse.RenderTransform>
            <Ellipse.Fill>
                <RadialGradientBrush>
                    <GradientStop Color="#00FF0000" />
                    <GradientStop Color="#FFFF0000" Offset="0.25" />
                    <GradientStop Color="#00FF0000" Offset="0.5" />
                    <GradientStop Color="#FFFF0000" Offset="0.75" />
                    <GradientStop Color="#00FF0000" Offset="1" />
                </RadialGradientBrush>
            </Ellipse.Fill>
        </Ellipse>
        <Ellipse Height="20" Width="20" Canvas.Left="0" Canvas.Top="0" Fill="#FFFF0000" x:Name="ellipse1" />
    </Canvas>
</ControlTemplate >

3、Silverlight程序代码中使用,这里是通过选中ListBox中的站点名称,进行聚焦显示,方法如下:

 private void lbSearchSite_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
        {
            RainFall findResult = e.AddedItems[0] as RainFall;
            Graphic g = new Graphic()
            {
                Geometry = mercator.FromGeographic(new MapPoint(double.Parse(findResult.Latitute.ToString().Trim()), double.Parse(findResult.Longitute.ToString().Trim())))
            };
            MarkerSymbol symbol = new MarkerSymbol();
            string contentStr = new StreamReader(
                         Application.GetResourceStream(
                                  new Uri("/MapClient;component/Template/DefaultMarkerSymbol.xaml", UriKind.Relative)
                                  ).Stream).ReadToEnd();
            symbol.ControlTemplate = (ControlTemplate)XamlReader.Load(contentStr);
            symbol.OffsetX = 10;
            symbol.OffsetY = 10;
            g.Symbol = symbol;

            ESRI.ArcGIS.Client.Geometry.Envelope selectedFeatureExtent = mercator.ToGeographic(g.Geometry).Extent; //选中点的位置
            double expandPercentage = 10;

            //加数值后,聚焦(这里需要注意,进行地理坐标和墨卡托坐标的转换)
            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)
            {
            }
        }

        /// <summary>
        /// 显示聚焦点
        /// </summary>
        public void ShowFocus(Graphic g)
        {
            GraphicsLayer graphicsLayerSW = myMap.Layers["GraphicsLayerRed"] as GraphicsLayer;
            //产生红色光晕
            if (graphicsLayerSW.Graphics.Count < 1)
            {
                graphicsLayerSW.Graphics.Add(g);
            }
            else
            {
                graphicsLayerSW.Graphics.RemoveAt(0);
                graphicsLayerSW.Graphics.Add(g);
            }
        }


4、效果图如下:



相关文章
|
6月前
|
JSON API 数据格式
在钉钉开放平台中,创建或更新OA审批表单模板需要通过API接口进行操作
在钉钉开放平台中,创建或更新OA审批表单模板需要通过API接口进行操作【1月更文挑战第20天】【1月更文挑战第97篇】
165 1
|
6月前
|
编译器 API C++
【C++ 动态库设计】动态库中的模板函数:解决如果将模板函数封装成API库
【C++ 动态库设计】动态库中的模板函数:解决如果将模板函数封装成API库
274 0
|
6月前
|
小程序 IDE Java
社区每周丨订单中心模板更新及基础API增加音频与动画(5.15-5.19)
社区每周丨订单中心模板更新及基础API增加音频与动画(5.15-5.19)
74 11
|
6月前
|
小程序 IDE Java
社区每周丨订单中心模板更新及基础API增加音频与动画(5.15-5.19)
社区每周丨订单中心模板更新及基础API增加音频与动画(5.15-5.19)
61 11
|
6月前
|
JavaScript 前端开发 IDE
Vue3【为什么选择Vue框架、Vue简介 、Vue API 风格 、Vue开发前的准备 、Vue项目目录结构 、模板语法、属性绑定 、 】(一)-全面详解(学习总结---从入门到深化)
Vue3【为什么选择Vue框架、Vue简介 、Vue API 风格 、Vue开发前的准备 、Vue项目目录结构 、模板语法、属性绑定 、 】(一)-全面详解(学习总结---从入门到深化)
97 1
|
6月前
|
定位技术 Python
ArcGIS中ArcMap通过模型构建器ModelBuilder导出地理与投影坐标系转换Python代码的方法
ArcGIS中ArcMap通过模型构建器ModelBuilder导出地理与投影坐标系转换Python代码的方法
116 2
|
6月前
|
JavaScript 前端开发 算法
Vue 3.0 组合式API 模板引用
Vue 3.0 组合式API 模板引用
34 0
|
人工智能 数据可视化 API
ArcGIS API for Python
ArcGIS API for Python
66 0
|
安全 Java fastjson
企业微信API-https请求模板-获取access_token-Java
企业微信API-https请求模板-获取access_token-Java
258 0
|
JavaScript 前端开发 应用服务中间件
Arcgis api for javascript 详细部署
Arcgis api for javascript 详细部署