1、首先在SL项目中添加一个抽象类ContextMenu.cs文件,代码如下:
using System; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Ink; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.Windows.Controls.Primitives; namespace MapClient { public abstract class ContextMenu { private Point _location; private bool _isShowing; private Popup _popup; private Grid _grid; private Canvas _canvas; private FrameworkElement _content; //初始化并显示弹出窗体.公共方法在显示菜单项时调用 public void Show(Point location) { if (_isShowing) throw new InvalidOperationException(); _isShowing = true; _location = location; ConstructPopup(); _popup.IsOpen = true; } //关闭弹出窗体 public void Close() { _isShowing = false; if (_popup != null) { _popup.IsOpen = false; } } //abstract function that the child class needs to implement to return the framework element that needs to be displayed in the popup window. protected abstract FrameworkElement GetContent(); //Default behavior for OnClickOutside() is to close the context menu when there is a mouse click event outside the context menu protected virtual void OnClickOutside() { Close(); } // 用Grid来布局,初始化弹出窗体 //在Grid里面添加一个Canvas,用来监测菜单项外面的鼠标点击事件 // // Add the Framework Element returned by GetContent() to the grid and position it at _location private void ConstructPopup() { if (_popup != null) return; _popup = new Popup(); _grid = new Grid(); _popup.Child = _grid; _canvas = new Canvas(); _canvas.MouseLeftButtonDown += (sender, args) => { OnClickOutside(); }; _canvas.MouseRightButtonDown += (sender, args) => { args.Handled = true; OnClickOutside(); }; _canvas.Background = new SolidColorBrush(Colors.Transparent); _grid.Children.Add(_canvas); _content = GetContent(); _content.HorizontalAlignment = HorizontalAlignment.Left; _content.VerticalAlignment = VerticalAlignment.Top; _content.Margin = new Thickness(_location.X, _location.Y, 0, 0); _grid.Children.Add(_content); UpdateSize(); } /// <summary> /// 更新大小 /// </summary> private void UpdateSize() { _grid.Width = Application.Current.Host.Content.ActualWidth; _grid.Height = Application.Current.Host.Content.ActualHeight; if (_canvas != null) { _canvas.Width = _grid.Width; _canvas.Height = _grid.Height; } } } }
2、再添加一个类用来实现左键点击弹出控件MapTips.cs文件,代码如下
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.Windows.Media.Effects; using System.Windows.Media.Imaging; using MapClient.ServiceReference1; namespace MapClient { public class MapTips : ContextMenu { RichTextBox rtb; string placeName = string.Empty; string areaID = string.Empty; string year = string.Empty; string cycleID = string.Empty; //弹出窗口中的显示文本控件 TextBlock tb_title; //标题 TextBlock tb_grade1; //苗情等级1 TextBlock tb_grade2; //苗情等级2 TextBlock tb_grade3; //苗情等级3 TextBlock tb_grade4; //苗情等级4 TextBlock tb_percent1; //占比1 TextBlock tb_percent2; //占比2 TextBlock tb_percent3; //占比3 TextBlock tb_percent4; //占比4 TextBlock tb_area1; //面积1 TextBlock tb_area2; //面积2 TextBlock tb_area3; //面积3 TextBlock tb_area4; //面积4 HyperlinkButton hlb1; //超链接1 HyperlinkButton hlb2; //超链接2 HyperlinkButton hlb3; //超链接3 public MapTips(RichTextBox rtb, string name, string areaID, string year, string cycleID) { this.rtb = rtb; this.placeName = name; this.areaID = areaID; this.year = year; this.cycleID = cycleID; } //构造菜单按钮并返回一个FrameworkElement对象 protected override FrameworkElement GetContent() { Border border = new Border() { BorderBrush = new SolidColorBrush(Color.FromArgb(255, 167, 171, 176)), BorderThickness = new Thickness(1), Background = new SolidColorBrush(Colors.White) }; border.Effect = new DropShadowEffect() { BlurRadius = 3, Color = Color.FromArgb(255, 230, 227, 236) }; Grid grid = new Grid() { Margin = new Thickness(1) }; //九行 grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(30) }); grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(30) }); grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(30) }); grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(30) }); grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(30) }); grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(30) }); grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(30) }); grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(30) }); grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(30) }); //三列 grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(80) }); grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(80) }); grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(80) }); //标题第一列 tb_title = new TextBlock() { FontSize = 14, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center }; Grid.SetRow(tb_title, 0); Grid.SetColumn(tb_title, 0); Grid.SetColumnSpan(tb_title, 3); grid.Children.Add(tb_title); //苗情等级标题 TextBlock tb_grade = new TextBlock() { Text = "苗情等级", FontSize = 14, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center }; Grid.SetRow(tb_grade, 1); Grid.SetColumn(tb_grade, 0); grid.Children.Add(tb_grade); //旺苗 tb_grade1 = new TextBlock() { FontSize = 14, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center }; Grid.SetRow(tb_grade1, 2); Grid.SetColumn(tb_grade1, 0); grid.Children.Add(tb_grade1); //一级苗 tb_grade2 = new TextBlock() { FontSize = 14, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center }; Grid.SetRow(tb_grade2, 3); Grid.SetColumn(tb_grade2, 0); grid.Children.Add(tb_grade2); //二级苗 tb_grade3 = new TextBlock() { FontSize = 14, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center }; Grid.SetRow(tb_grade3, 4); Grid.SetColumn(tb_grade3, 0); grid.Children.Add(tb_grade3); //三级苗 tb_grade4 = new TextBlock() { FontSize = 14, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center }; Grid.SetRow(tb_grade4, 5); Grid.SetColumn(tb_grade4, 0); grid.Children.Add(tb_grade4); //占比标题 TextBlock tb_percent = new TextBlock() { Text = "占 比", FontSize = 14, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center }; Grid.SetRow(tb_percent, 1); Grid.SetColumn(tb_percent, 1); grid.Children.Add(tb_percent); //旺苗占比 tb_percent1 = new TextBlock() { FontSize = 14, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center }; Grid.SetRow(tb_percent1, 2); Grid.SetColumn(tb_percent1, 1); grid.Children.Add(tb_percent1); //一级苗占比 tb_percent2 = new TextBlock() { FontSize = 14, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center }; Grid.SetRow(tb_percent2, 3); Grid.SetColumn(tb_percent2, 1); grid.Children.Add(tb_percent2); //二级苗占比 tb_percent3 = new TextBlock() { FontSize = 14, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center }; Grid.SetRow(tb_percent3, 4); Grid.SetColumn(tb_percent3, 1); grid.Children.Add(tb_percent3); //三级苗占比 tb_percent4 = new TextBlock() { FontSize = 14, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center }; Grid.SetRow(tb_percent4, 5); Grid.SetColumn(tb_percent4, 1); grid.Children.Add(tb_percent4); //面积标题 TextBlock tb_area = new TextBlock() { Text = "面积(万亩)", FontSize = 14, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center }; Grid.SetRow(tb_area, 1); Grid.SetColumn(tb_area, 2); grid.Children.Add(tb_area); //旺苗面积(万亩) tb_area1 = new TextBlock() { FontSize = 14, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center }; Grid.SetRow(tb_area1, 2); Grid.SetColumn(tb_area1, 2); grid.Children.Add(tb_area1); //一级苗面积(万亩) tb_area2 = new TextBlock() { FontSize = 14, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center }; Grid.SetRow(tb_area2, 3); Grid.SetColumn(tb_area2, 2); grid.Children.Add(tb_area2); //二级苗面积(万亩) tb_area3 = new TextBlock() { FontSize = 14, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center }; Grid.SetRow(tb_area3, 4); Grid.SetColumn(tb_area3, 2); grid.Children.Add(tb_area3); //三级苗面积(万亩) tb_area4 = new TextBlock() { FontSize = 14, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center }; Grid.SetRow(tb_area4, 5); Grid.SetColumn(tb_area4, 2); grid.Children.Add(tb_area4); //超链接(苗情评价分析) hlb1 = new HyperlinkButton() { FontSize = 14, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center }; Grid.SetRow(hlb1, 6); Grid.SetColumn(hlb1, 0); Grid.SetColumnSpan(hlb1, 3); grid.Children.Add(hlb1); //超链接(苗情数据报表) hlb2 = new HyperlinkButton() { FontSize = 14, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center }; Grid.SetRow(hlb2, 7); Grid.SetColumn(hlb2, 0); Grid.SetColumnSpan(hlb2, 3); grid.Children.Add(hlb2); //超链接(苗情监测报告) hlb3 = new HyperlinkButton() { FontSize = 14, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center }; Grid.SetRow(hlb3, 8); Grid.SetColumn(hlb3, 0); Grid.SetColumnSpan(hlb3, 3); grid.Children.Add(hlb3); border.Child = grid; getData1SoapClient client = new getData1SoapClient(); client.GetCommentInfoCompleted += new EventHandler<GetCommentInfoCompletedEventArgs>(client_GetCommentInfoCompleted); client.GetCommentInfoAsync(areaID, year, cycleID); return border; } void client_GetCommentInfoCompleted(object sender, GetCommentInfoCompletedEventArgs e) { //设置值 tb_title.Text = result.Split(',')[0].Split(':')[1]; //苗情评价分析 hlb1.Content = result.Split(',')[1].Split(':')[1]; hlb1.NavigateUri = new Uri("http://www.baidu.com", UriKind.RelativeOrAbsolute); //苗情数据报表 hlb2.Content = result.Split(',')[2].Split(':')[1]; hlb2.NavigateUri = new Uri("http://www.baidu.com", UriKind.RelativeOrAbsolute); //苗情监测报告 hlb3.Content = result.Split(',')[3].Split(':')[1]; hlb3.NavigateUri = new Uri("http://www.baidu.com", UriKind.RelativeOrAbsolute); //旺苗等级、占比和面积 tb_grade1.Text = result.Split(',')[4].Split('|')[0].Split(':')[1]; tb_percent1.Text = result.Split(',')[4].Split('|')[1].Split(':')[1]; tb_area1.Text = result.Split(',')[4].Split('|')[2].Split(':')[1]; //一级苗等级、占比和面积 tb_grade2.Text = result.Split(',')[5].Split('|')[0].Split(':')[1]; tb_percent2.Text = result.Split(',')[5].Split('|')[1].Split(':')[1]; tb_area2.Text = result.Split(',')[5].Split('|')[2].Split(':')[1]; //二级苗等级、占比和面积 tb_grade3.Text = result.Split(',')[6].Split('|')[0].Split(':')[1]; tb_percent3.Text = result.Split(',')[6].Split('|')[1].Split(':')[1]; tb_area3.Text = result.Split(',')[6].Split('|')[2].Split(':')[1]; //三级苗等级、占比和面积 tb_grade4.Text = result.Split(',')[7].Split('|')[0].Split(':')[1]; tb_percent4.Text = result.Split(',')[7].Split('|')[1].Split(':')[1]; tb_area4.Text = result.Split(',')[7].Split('|')[2].Split(':')[1]; } } }
3、添加一个鼠标右键弹出的快捷菜单控件RTBContextMenu .cs文件,代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.Windows.Media.Effects; using System.Windows.Media.Imaging; namespace MapClient { public class RTBContextMenu : ContextMenu { RichTextBox rtb; string placeName = string.Empty; public RTBContextMenu(RichTextBox rtb, string name) { this.rtb = rtb; this.placeName = name; } //构造菜单按钮并返回一个FrameworkElement对象 protected override FrameworkElement GetContent() { Border border = new Border() { BorderBrush = new SolidColorBrush(Color.FromArgb(255, 167, 171, 176)), BorderThickness = new Thickness(1), Background = new SolidColorBrush(Colors.White) }; border.Effect = new DropShadowEffect() { BlurRadius = 3, Color = Color.FromArgb(255, 230, 227, 236) }; Grid grid = new Grid() { Margin = new Thickness(1) }; grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(25) }); grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(105) }); grid.Children.Add(new Rectangle() { Fill = new SolidColorBrush(Color.FromArgb(255, 233, 238, 238)) }); grid.Children.Add(new Rectangle() { Fill = new SolidColorBrush(Color.FromArgb(255, 226, 228, 231)), HorizontalAlignment = HorizontalAlignment.Right, Width = 1 }); //田间视频 Button tjspButton = new Button() { Height = 22, Margin = new Thickness(0, 0, 0, 0), HorizontalAlignment = HorizontalAlignment.Stretch, VerticalAlignment = VerticalAlignment.Top, HorizontalContentAlignment = HorizontalAlignment.Left }; tjspButton.Style = Application.Current.Resources["ContextMenuButton"] as Style; tjspButton.Click += tjsp_MouseLeftButtonUp; Grid.SetColumnSpan(tjspButton, 2); StackPanel sp = new StackPanel() { Orientation = Orientation.Horizontal }; Image tjspImage = new Image() { HorizontalAlignment = HorizontalAlignment.Left, Width = 16, Height = 16, Margin = new Thickness(1, 0, 0, 0) }; tjspImage.Source = new BitmapImage(new Uri("/MapClient;component/Images/pop-movie.png", UriKind.RelativeOrAbsolute)); sp.Children.Add(tjspImage); TextBlock tjspText = new TextBlock() { Text = "田间视频", HorizontalAlignment = HorizontalAlignment.Left, Margin = new Thickness(16, 0, 0, 0) }; sp.Children.Add(tjspText); tjspButton.Content = sp; grid.Children.Add(tjspButton); //作物像片 Button zwxpButton = new Button() { Height = 22, Margin = new Thickness(0, 24, 0, 0), HorizontalAlignment = HorizontalAlignment.Stretch, VerticalAlignment = VerticalAlignment.Top, HorizontalContentAlignment = HorizontalAlignment.Left }; zwxpButton.Style = Application.Current.Resources["ContextMenuButton"] as Style; zwxpButton.Click += zwxp_MouseLeftButtonUp; Grid.SetColumnSpan(zwxpButton, 2); sp = new StackPanel() { Orientation = Orientation.Horizontal }; Image zwxpImage = new Image() { HorizontalAlignment = HorizontalAlignment.Left, Width = 16, Height = 16, Margin = new Thickness(1, 0, 0, 0) }; zwxpImage.Source = new BitmapImage(new Uri("/MapClient;component/Images/pop-pic.png", UriKind.RelativeOrAbsolute)); sp.Children.Add(zwxpImage); TextBlock zwxpText = new TextBlock() { Text = "作物图片", HorizontalAlignment = HorizontalAlignment.Left, Margin = new Thickness(16, 0, 0, 0) }; sp.Children.Add(zwxpText); zwxpButton.Content = sp; grid.Children.Add(zwxpButton); //专家会议 Button zjhyButton = new Button() { Height = 22, Margin = new Thickness(0, 48, 0, 0), HorizontalAlignment = HorizontalAlignment.Stretch, VerticalAlignment = VerticalAlignment.Top, HorizontalContentAlignment = HorizontalAlignment.Left }; zjhyButton.Style = Application.Current.Resources["ContextMenuButton"] as Style; zjhyButton.Click += zjhy_MouseLeftButtonUp; Grid.SetColumnSpan(zjhyButton, 2); sp = new StackPanel() { Orientation = Orientation.Horizontal }; Image zjhyImage = new Image() { HorizontalAlignment = HorizontalAlignment.Left, Width = 16, Height = 16, Margin = new Thickness(1, 0, 0, 0) }; zjhyImage.Source = new BitmapImage(new Uri("/MapClient;component/Images/pop-person.png", UriKind.RelativeOrAbsolute)); sp.Children.Add(zjhyImage); TextBlock zjhyText = new TextBlock() { Text = "专家会议", HorizontalAlignment = HorizontalAlignment.Left, Margin = new Thickness(16, 0, 0, 0) }; sp.Children.Add(zjhyText); zjhyButton.Content = sp; grid.Children.Add(zjhyButton); //现场联动 Button xcldButton = new Button() { Height = 22, Margin = new Thickness(0, 72, 0, 0), HorizontalAlignment = HorizontalAlignment.Stretch, VerticalAlignment = VerticalAlignment.Top, HorizontalContentAlignment = HorizontalAlignment.Left }; xcldButton.Style = Application.Current.Resources["ContextMenuButton"] as Style; xcldButton.Click += xcld_MouseLeftButtonUp; Grid.SetColumnSpan(xcldButton, 2); sp = new StackPanel() { Orientation = Orientation.Horizontal }; Image xcldImage = new Image() { HorizontalAlignment = HorizontalAlignment.Left, Width = 16, Height = 16, Margin = new Thickness(1, 0, 0, 0) }; xcldImage.Source = new BitmapImage(new Uri("/MapClient;component/Images/pop-link.png", UriKind.RelativeOrAbsolute)); sp.Children.Add(xcldImage); TextBlock xcldText = new TextBlock() { Text = "现场联动", HorizontalAlignment = HorizontalAlignment.Left, Margin = new Thickness(16, 0, 0, 0) }; sp.Children.Add(xcldText); xcldButton.Content = sp; grid.Children.Add(xcldButton); border.Child = grid; return border; } // //处理事件 // void tjsp_MouseLeftButtonUp(object sender, RoutedEventArgs e) { //页面跳转,使用参数进行url传递 参数值为placeName(请注意) System.Windows.Browser.HtmlPage.Window.Navigate(new Uri("../SensorMonitor/VedioList.aspx?AreaName=" + placeName, UriKind.RelativeOrAbsolute), "_self"); Close(); } void zwxp_MouseLeftButtonUp(object sender, RoutedEventArgs e) { //页面跳转 System.Windows.Browser.HtmlPage.Window.Navigate(new Uri("../SensorMonitor/InstantImage.aspx?AreaName=" + placeName, UriKind.RelativeOrAbsolute), "_self"); Close(); } void zjhy_MouseLeftButtonUp(object sender, RoutedEventArgs e) { //页面跳转 System.Windows.Browser.HtmlPage.Window.Navigate(new Uri("http://www.baidu.com", UriKind.RelativeOrAbsolute), "_self"); Close(); } void xcld_MouseLeftButtonUp(object sender, RoutedEventArgs e) { //页面跳转 System.Windows.Browser.HtmlPage.Window.Navigate(new Uri("http://www.baidu.com", UriKind.RelativeOrAbsolute), "_self"); Close(); } } }
4、MainPage.xaml及MainPage.xaml.cs代码如下:
<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:esri="http://schemas.esri.com/arcgis/client/2009" xmlns:toolkit="clr-namespace:ESRI.ArcGIS.Client.Toolkit;assembly=ESRI.ArcGIS.Client.Toolkit" xmlns:symbols="clr-namespace:ESRI.ArcGIS.Client.Symbols;assembly=ESRI.ArcGIS.Client" xmlns:local="clr-namespace:GrowthMonitor" xmlns:vsm="clr-namespace:System.Windows;assembly=System.Windows" xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:interaction="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" xmlns:slData="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" x:Class="MapClient.MainPage" d:DesignHeight="300" d:DesignWidth="400" Loaded="UserControl_Loaded" mc:Ignorable="d"> <Grid x:Name="LayoutRoot" Background="White"> <Grid.Resources> <esri:SimpleMarkerSymbol x:Key="DefaultMarkerSymbol" Size="12" x:Name="dms_Point" Style="Circle"> <esri:SimpleMarkerSymbol.ControlTemplate> <ControlTemplate> <Grid x:Name="RootElement" RenderTransformOrigin="0.5,0.5" > <Grid.RenderTransform> <ScaleTransform ScaleX="1" ScaleY="1" /> </Grid.RenderTransform> <VisualStateManager.VisualStateGroups> <VisualStateGroup x:Name="CommonStates"> <VisualState x:Name="Normal"> <Storyboard> <DoubleAnimation BeginTime="00:00:00" Storyboard.TargetName="RootElement" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleX)" To="1" Duration="0:0:0.1" /> <DoubleAnimation BeginTime="00:00:00" Storyboard.TargetName="RootElement" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)" To="1" Duration="0:0:0.1" /> </Storyboard> </VisualState> <VisualState x:Name="MouseOver"> <Storyboard> <DoubleAnimation BeginTime="00:00:00" Storyboard.TargetName="RootElement" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleX)" To="1.5" Duration="0:0:0.1" /> <DoubleAnimation BeginTime="00:00:00" Storyboard.TargetName="RootElement" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)" To="1.5" Duration="0:0:0.1" /> </Storyboard> </VisualState> </VisualStateGroup> </VisualStateManager.VisualStateGroups> <Ellipse x:Name="ellipse" Width="{Binding Symbol.Size}" Height="{Binding Symbol.Size}" > <Ellipse.Fill> <RadialGradientBrush GradientOrigin="0.5,0.5" Center="0.5,0.5" RadiusX="0.5" RadiusY="0.5"> <GradientStop Color="Red" Offset="0.25" /> </RadialGradientBrush> </Ellipse.Fill> </Ellipse> </Grid> </ControlTemplate> </esri:SimpleMarkerSymbol.ControlTemplate> </esri:SimpleMarkerSymbol> <esri:SimpleLineSymbol x:Key="DefaultLineSymbol" Color="Red" Width="6" /> <esri:SimpleFillSymbol x:Key="DefaultFillSymbol" BorderBrush="Red" BorderThickness="2" x:Name="sf_Point"/> </Grid.Resources> <esri:Map x:Name="myMap" IsLogoVisible="False" Extent="114.289579051054,29.3907111115968,121.380372848428,33.7272787947227"> <i:Interaction.Behaviors> <local:WheelZoom /> </i:Interaction.Behaviors> <esri:Map.Layers> <esri:ArcGISTiledMapServiceLayer ID="BaseLayer" Url="http://192.168.2.5/arcgis/rest/services/AnHuiBase/MapServer"/> <!---特征图层--> <!--<esri:FeatureLayer ID="MyFeatureLayer" Url="http://192.168.2.5/arcgis/rest/services/AnHuiDynamic/MapServer/0"> <esri:FeatureLayer.Clusterer> <esri:FlareClusterer FlareBackground="#99FF0000" FlareForeground="White" MaximumFlareCount="9"/> </esri:FeatureLayer.Clusterer> <esri:FeatureLayer.OutFields> <sys:String>ID</sys:String> <sys:String>Name</sys:String> </esri:FeatureLayer.OutFields> <esri:FeatureLayer.MapTip> <Grid Background="Blue" Width="200" Height="200"> <StackPanel> <TextBlock Text="{Binding [Name]}" Foreground="White" FontWeight="Bold" /> </StackPanel> </Grid> </esri:FeatureLayer.MapTip> </esri:FeatureLayer>--> <!--GraphicsLayer--> <esri:GraphicsLayer ID="MyGraphicsLayer"> </esri:GraphicsLayer> </esri:Map.Layers> </esri:Map> <Grid Height="60" HorizontalAlignment="Right" VerticalAlignment="Top" Width="300"> <Grid.ColumnDefinitions> <ColumnDefinition Width="0.128*"/> <ColumnDefinition Width="0.142*"/> <ColumnDefinition Width="0.14*"/> <ColumnDefinition Width="0.15*"/> <ColumnDefinition Width="0.14*"/> <ColumnDefinition Width="0.14*"/> <ColumnDefinition Width="0.15*"/> </Grid.ColumnDefinitions> <Border x:Name="bZoomIn" BorderThickness="1" Margin="0,-1,0,1"> <Border.Background> <ImageBrush ImageSource="Images/i_zoomin.png" Stretch="None"/> </Border.Background> </Border> <Border x:Name="bZoomOut" BorderThickness="1" Grid.Column="1" Margin="3,-2,2,2"> <Border.Background> <ImageBrush ImageSource="Images/i_zoomout.png" Stretch="None"/> </Border.Background> </Border> <Border x:Name="bPan" BorderThickness="1" Grid.Column="2" Margin="2,-1,2,1"> <Border.Background> <ImageBrush ImageSource="Images/i_pan.png" Stretch="None"/> </Border.Background> </Border> <Border x:Name="bPrevious" BorderThickness="1" Grid.Column="3" Margin="4,1,5,-1"> <Border.Background> <ImageBrush ImageSource="Images/i_previous.png" Stretch="None"/> </Border.Background> </Border> <Border x:Name="bNext" BorderThickness="1" Grid.Column="4" Margin="4,2,1,-2" RenderTransformOrigin="1.385,0.545"> <Border.Background> <ImageBrush ImageSource="Images/i_next.png" Stretch="None"/> </Border.Background> </Border> <Border x:Name="bFullExtent" BorderThickness="1" Grid.Column="5" Margin="2,0" RenderTransformOrigin="1.385,0.545"> <Border.Background> <ImageBrush ImageSource="Images/i_globe.png" Stretch="None"/> </Border.Background> </Border> <Border x:Name="bFullScreen" BorderThickness="1" Grid.Column="6" Margin="8,0,1,0" RenderTransformOrigin="1.385,0.545"> <Border.Background> <ImageBrush ImageSource="Images/i_widget.png" Stretch="None"/> </Border.Background> </Border> </Grid> <esri:Navigation Margin="5" HorizontalAlignment="Left" VerticalAlignment="Bottom" Map="{Binding ElementName=myMap}" > </esri:Navigation> <esri:MapProgressBar x:Name="MyProgressBar" Map="{Binding ElementName=myMap}" HorizontalAlignment="Center" VerticalAlignment="Bottom" Width="200" Height="36" Margin="25" /> <StackPanel HorizontalAlignment="Right" Orientation="Horizontal" Margin="0,1,1,0" VerticalAlignment="Top"> <Button Style="{StaticResource darkButtonStyle}" Margin="3,0,0,0" > <i:Interaction.Triggers> <i:EventTrigger EventName="Click" > <local:ToggleFullScreenAction /> </i:EventTrigger> </i:Interaction.Triggers> <Image Source="Images/Fullscreen-32.png" Height="24" Margin="-4" ToolTipService.ToolTip="全屏"/> </Button> </StackPanel> <Button Content="查找" Height="23" HorizontalAlignment="Left" Margin="279,110,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" /> <TextBox Height="23" HorizontalAlignment="Left" Margin="161,110,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" /> <sdk:Label Height="28" HorizontalAlignment="Left" Margin="45,110,0,0" Name="label1" FontSize="15" Content="输入监测点名称:" VerticalAlignment="Top" Width="120" /> </Grid> </UserControl>
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using ESRI.ArcGIS.Client.Symbols; using ESRI.ArcGIS.Client; using ESRI.ArcGIS.Client.Tasks; using System.Windows.Data; using System.Runtime.Serialization; using ESRI.ArcGIS.Client.Geometry; using MapClient.UserControls; namespace MapClient { public partial class MainPage : UserControl { //一些列变量定义 public string str = null; //用来接收aspx页面传递到xap中的参数字符串 string[] infos = null; public string level = string.Empty; //市县等级 市=1/县=2 public string areaId = string.Empty; //地区ID,包括市及县的编号 public string color = string.Empty; //颜色值 public string year = string.Empty; //年份 public string cycleId = string.Empty; //生育周期编号 public MainPage(Dictionary<string, string> paramsDic) { InitializeComponent(); if (paramsDic.TryGetValue("STR", out str)) { //获取到aspx页面传递过来的参数 } //按照|进行拆分成每一个监测点的信息 infos = str.Split('|'); //初始化页面,开始地图加载条 MyDrawObject = new Draw(myMap) { FillSymbol = LayoutRoot.Resources["DefaultFillSymbol"] as ESRI.ArcGIS.Client.Symbols.FillSymbol, DrawMode = DrawMode.Rectangle }; MyDrawObject.DrawComplete += myDrawObject_DrawComplete; } private void UserControl_Loaded(object sender, RoutedEventArgs e) { FindGraphicsAndShowInMap("监测点"); } private void Button_Click(object sender, RoutedEventArgs e) { FindGraphicsAndShowInMap("临泉监测点"); } //#region 市界图层 //public void FindCityGraphicsAndShowInMap(string conditions) //{ // // 初始化查找操作 // FindTask findCityTask = new FindTask("http://192.168.2.5/arcgis/rest/services/AnHuiDynamic/MapServer/"); // findCityTask.ExecuteCompleted += new EventHandler<FindEventArgs>(findCityTask_ExecuteCompleted); // findCityTask.Failed += new EventHandler<TaskFailedEventArgs>(findCityTask_Failed); // //初始化查找参数,指定Name字段作为小麦监测点层的搜素条件,并返回特征图层作为查找结果 // FindParameters findParameters = new FindParameters(); // findParameters.LayerIds.AddRange(new int[] { 2 }); // findParameters.SearchFields.AddRange(new string[] { "AreaID", "NAME" }); // findParameters.ReturnGeometry = true; // //要查找点的信息 // findParameters.SearchText = conditions; // findCityTask.ExecuteAsync(findParameters); //} ////查找失败 //void findCityTask_Failed(object sender, TaskFailedEventArgs e) //{ // MessageBox.Show("查找失败: " + e.Error); //} //void findCityTask_ExecuteCompleted(object sender, FindEventArgs e) //{ // // 清除先前的图层 // GraphicsLayer graphicsLayer = myMap.Layers["MyGraphicsLayer"] as GraphicsLayer; // graphicsLayer.ClearGraphics(); // // 检查新的结果 // if (e.FindResults.Count > 0) // { // //将查询出来的结果在地图上显示出来 // foreach (FindResult result in e.FindResults) // { // result.Feature.Symbol = LayoutRoot.Resources["DefaultFillSymbol"] as ESRI.ArcGIS.Client.Symbols.Symbol; // graphicsLayer.Graphics.Add(result.Feature); // //左键菜单 // result.Feature.MouseLeftButtonDown += new MouseButtonEventHandler(Feature_MouseLeftButtonDown); // result.Feature.MouseLeftButtonUp += new MouseButtonEventHandler(Feature_MouseLeftButtonUp); // //右键菜单 // result.Feature.MouseRightButtonDown += new MouseButtonEventHandler(Feature_MouseRightButtonDown); // result.Feature.MouseRightButtonUp += new MouseButtonEventHandler(Feature_MouseRightButtonUp); // } // //坐标自动定位 // ESRI.ArcGIS.Client.Geometry.Envelope selectedFeatureExtent = e.FindResults[0].Feature.Geometry.Extent; // double expandPercentage = 30; // double widthExpand = selectedFeatureExtent.Width * (expandPercentage / 100); // double heightExpand = selectedFeatureExtent.Height * (expandPercentage / 100); // ESRI.ArcGIS.Client.Geometry.Envelope displayExtent = new ESRI.ArcGIS.Client.Geometry.Envelope( // selectedFeatureExtent.XMin - (widthExpand / 2), // selectedFeatureExtent.YMin - (heightExpand / 2), // selectedFeatureExtent.XMax + (widthExpand / 2), // selectedFeatureExtent.YMax + (heightExpand / 2)); // myMap.ZoomTo(displayExtent); // } // else // { // MessageBox.Show("没有发现匹配该搜索的记录!"); // } //} //#endregion #region 小麦监测点图层 /// <summary> /// 根据条件查找监测点图层(0) /// </summary> /// <param name="conditions"></param> public void FindGraphicsAndShowInMap(string conditions) { // 初始化查找操作 FindTask findTask = new FindTask("http://192.168.2.5/arcgis/rest/services/AnHuiDynamic/MapServer/"); findTask.ExecuteCompleted += FindTask_ExecuteCompleted; findTask.Failed += FindTask_Failed; //初始化查找参数,指定Name字段作为小麦监测点层的搜素条件,并返回特征图层作为查找结果 FindParameters findParameters = new FindParameters(); findParameters.LayerIds.AddRange(new int[] { 0 }); findParameters.SearchFields.AddRange(new string[] { "ID", "Name" }); findParameters.ReturnGeometry = true; //要查找点的信息 findParameters.SearchText = conditions; findTask.ExecuteAsync(findParameters); } #region FindTask 查找任务开始 // 查找结束时,开始绘制点到图层上 private void FindTask_ExecuteCompleted(object sender, FindEventArgs args) { // 清除先前的图层 GraphicsLayer graphicsLayer = myMap.Layers["MyGraphicsLayer"] as GraphicsLayer; graphicsLayer.ClearGraphics(); // 检查新的结果 if (args.FindResults.Count > 0) { //将查询出来的结果在地图上显示出来 foreach (FindResult result in args.FindResults) { //赋值颜色值 this.dms_Point.Color = new SolidColorBrush(Colors.Red); result.Feature.Symbol = LayoutRoot.Resources["DefaultMarkerSymbol"] as ESRI.ArcGIS.Client.Symbols.Symbol; graphicsLayer.Graphics.Add(result.Feature); //左键菜单 result.Feature.MouseLeftButtonDown += new MouseButtonEventHandler(Feature_MouseLeftButtonDown); result.Feature.MouseLeftButtonUp += new MouseButtonEventHandler(Feature_MouseLeftButtonUp); //右键菜单 result.Feature.MouseRightButtonDown += new MouseButtonEventHandler(Feature_MouseRightButtonDown); result.Feature.MouseRightButtonUp += new MouseButtonEventHandler(Feature_MouseRightButtonUp); } //坐标自动定位 ESRI.ArcGIS.Client.Geometry.Envelope selectedFeatureExtent = args.FindResults[0].Feature.Geometry.Extent; double expandPercentage = 30; double widthExpand = selectedFeatureExtent.Width * (expandPercentage / 100); double heightExpand = selectedFeatureExtent.Height * (expandPercentage / 100); ESRI.ArcGIS.Client.Geometry.Envelope displayExtent = new ESRI.ArcGIS.Client.Geometry.Envelope( selectedFeatureExtent.XMin - (widthExpand / 2), selectedFeatureExtent.YMin - (heightExpand / 2), selectedFeatureExtent.XMax + (widthExpand / 2), selectedFeatureExtent.YMax + (heightExpand / 2)); myMap.ZoomTo(displayExtent); } else { MessageBox.Show("没有发现匹配该搜索的记录!"); } } //当查找失败时进行提示操作 private void FindTask_Failed(object sender, TaskFailedEventArgs args) { MessageBox.Show("查找失败: " + args.Error); } #endregion FindTask 查找任务结束 #endregion RichTextBox rtb; #region 鼠标左键事件开始 void Feature_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { //鼠标左键,显示ToolTip信息 Graphic g = sender as Graphic; //这里需要添加一个不消失的弹出框,并可以移入进行点击 MapTips tips = new MapTips(rtb, g.Attributes["Name"].ToString().Trim(), g.Attributes["AreaID"].ToString().Trim(), "-1", "-1"); tips.Show(e.GetPosition(LayoutRoot)); } void Feature_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { e.Handled = true; } #endregion 鼠标左键事件结束 #region 鼠标右键事件开始 void Feature_MouseRightButtonUp(object sender, MouseButtonEventArgs e) { Graphic g = sender as Graphic; RTBContextMenu menu = new RTBContextMenu(rtb, g.Attributes["Name"].ToString().Trim()); menu.Show(e.GetPosition(LayoutRoot)); } void Feature_MouseRightButtonDown(object sender, MouseButtonEventArgs e) { e.Handled = true; } #endregion 鼠标右键事件结束 string _toolMode = ""; List<Envelope> _extentHistory = new List<Envelope>(); int _currentExtentIndex = 0; bool _newExtent = true; Image _previousExtentImage; Image _nextExtentImage; private Draw MyDrawObject; private void MyToolbar_ToolbarItemClicked(object sender, ESRI.ArcGIS.Client.Toolkit.SelectedToolbarItemArgs e) { MyDrawObject.IsEnabled = false; _toolMode = ""; switch (e.Index) { case 0: // ZoomIn Layers MyDrawObject.IsEnabled = true; _toolMode = "zoomin"; break; case 1: // Zoom Out MyDrawObject.IsEnabled = true; _toolMode = "zoomout"; break; case 2: // Pan break; case 3: // Previous Extent if (_currentExtentIndex != 0) { _currentExtentIndex--; if (_currentExtentIndex == 0) { _previousExtentImage.Opacity = 0.3; _previousExtentImage.IsHitTestVisible = false; } _newExtent = false; myMap.IsHitTestVisible = false; myMap.ZoomTo(_extentHistory[_currentExtentIndex]); if (_nextExtentImage.IsHitTestVisible == false) { _nextExtentImage.Opacity = 1; _nextExtentImage.IsHitTestVisible = true; } } break; case 4: // Next Extent if (_currentExtentIndex < _extentHistory.Count - 1) { _currentExtentIndex++; if (_currentExtentIndex == (_extentHistory.Count - 1)) { _nextExtentImage.Opacity = 0.3; _nextExtentImage.IsHitTestVisible = false; } _newExtent = false; myMap.IsHitTestVisible = false; myMap.ZoomTo(_extentHistory[_currentExtentIndex]); if (_previousExtentImage.IsHitTestVisible == false) { _previousExtentImage.Opacity = 1; _previousExtentImage.IsHitTestVisible = true; } } break; case 5: // Full Extent myMap.ZoomTo(myMap.Layers.GetFullExtent()); break; case 6: // Full Screen Application.Current.Host.Content.IsFullScreen = !Application.Current.Host.Content.IsFullScreen; break; } } private void myDrawObject_DrawComplete(object sender, DrawEventArgs args) { if (_toolMode == "zoomin") { myMap.ZoomTo(args.Geometry as ESRI.ArcGIS.Client.Geometry.Envelope); } else if (_toolMode == "zoomout") { Envelope currentExtent = myMap.Extent; Envelope zoomBoxExtent = args.Geometry as Envelope; MapPoint zoomBoxCenter = zoomBoxExtent.GetCenter(); double whRatioCurrent = currentExtent.Width / currentExtent.Height; double whRatioZoomBox = zoomBoxExtent.Width / zoomBoxExtent.Height; Envelope newEnv = null; if (whRatioZoomBox > whRatioCurrent) // use width { double mapWidthPixels = myMap.Width; double multiplier = currentExtent.Width / zoomBoxExtent.Width; double newWidthMapUnits = currentExtent.Width * multiplier; newEnv = new Envelope(new MapPoint(zoomBoxCenter.X - (newWidthMapUnits / 2), zoomBoxCenter.Y), new MapPoint(zoomBoxCenter.X + (newWidthMapUnits / 2), zoomBoxCenter.Y)); } else // use height { double mapHeightPixels = myMap.Height; double multiplier = currentExtent.Height / zoomBoxExtent.Height; double newHeightMapUnits = currentExtent.Height * multiplier; newEnv = new Envelope(new MapPoint(zoomBoxCenter.X, zoomBoxCenter.Y - (newHeightMapUnits / 2)), new MapPoint(zoomBoxCenter.X, zoomBoxCenter.Y + (newHeightMapUnits / 2))); } if (newEnv != null) myMap.ZoomTo(newEnv); } } private void MyMap_ExtentChanged(object sender, ExtentEventArgs e) { if (e.OldExtent == null) { _extentHistory.Add(e.NewExtent.Clone()); return; } if (_newExtent) { _currentExtentIndex++; if (_extentHistory.Count - _currentExtentIndex > 0) _extentHistory.RemoveRange(_currentExtentIndex, (_extentHistory.Count - _currentExtentIndex)); if (_nextExtentImage.IsHitTestVisible == true) { _nextExtentImage.Opacity = 0.3; _nextExtentImage.IsHitTestVisible = false; } _extentHistory.Add(e.NewExtent.Clone()); if (_previousExtentImage.IsHitTestVisible == false) { _previousExtentImage.Opacity = 1; _previousExtentImage.IsHitTestVisible = true; } } else { myMap.IsHitTestVisible = true; _newExtent = true; } } private void button1_Click(object sender, RoutedEventArgs e) { if (this.textBox1.Text == "") { FindGraphicsAndShowInMap("0"); } else { FindGraphicsAndShowInMap(this.textBox1.Text.Trim()); } } } }
效果图如下:鼠标点击后弹出窗体,及鼠标右键弹出快捷菜单,如下:
以后继续完善,不断改进。
===========================================================================
如果觉得对您有帮助,微信扫一扫支持一下: