About the Implementing a property page for an ArcGIS Engine application Sample
[C#]
SymbolSelectorPropPage.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.SystemUI;
namespace SymbolSelector
{
[Guid("795FC5F5-4365-4cce-99C4-B5A3DDD1060A")]
[ComVisible(true)]
[ProgId("SymbolSelector.SymbolSelectorPropPage")]
[ClassInterface(ClassInterfaceType.None)]
public partial class SymbolSelectorPropPage : PropertyPage
{
//private AxMapControl m_axMapPreview = null;
private AxSymbologyControl m_axSymbologyControl = null;
public IStyleGalleryItem m_styleGalleryItem;
public SymbolSelectorPropPage()
{
InitializeComponent();
this.CreateControl();
}
protected override void OnPageDeactivate()
{
base.OnPageDeactivate();
//unwire the OnItemSelected event
m_axSymbologyControl.OnItemSelected -= new ISymbologyControlEvents_Ax_OnItemSelectedEventHandler(OnItemSelected);
//dispose the control
m_axSymbologyControl.Dispose();
m_axSymbologyControl = null;
}
protected override void OnPageApply()
{
base.OnPageApply();
PropertySheet propSheet = Objects[0] as PropertySheet;
IFeatureLayer layer = propSheet.FeatureLayer;
if (null == layer)
return;
if (m_styleGalleryItem == null) return;
IGeoFeatureLayer geoFeatureLayer = (IGeoFeatureLayer)layer;
//Create a new renderer
ISimpleRenderer simpleRenderer = new SimpleRendererClass();
//Set its symbol from the styleGalleryItem
simpleRenderer.Symbol = (ISymbol)m_styleGalleryItem.Item;
//Set the renderer into the geoFeatureLayer
geoFeatureLayer.Renderer = (IFeatureRenderer)simpleRenderer;
//Make the PropertyPage class fire an event notifying that the layer's renderer has changed
propSheet.FireFeatureLayerRendererChanged();
}
protected override void OnPageActivate(IntPtr hWndParent, Rectangle Rect, bool bModal)
{
try
{
base.OnPageActivate(hWndParent, Rect, bModal);
LoadStyle();
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.Message);
}
}
private void SetFeatureClassStyle(esriSymbologyStyleClass styleClass, ISymbol symbol)
{
m_styleGalleryItem = null;
//Get and set the style class
m_axSymbologyControl.StyleClass = styleClass;
ISymbologyStyleClass symbologyStyleClass = m_axSymbologyControl.GetStyleClass(styleClass);
//Create a new server style gallery item with its style set
IStyleGalleryItem styleGalleryItem = new ServerStyleGalleryItem();
styleGalleryItem.Item = symbol;
styleGalleryItem.Name = "mySymbol";
//Add the item to the style class and select it
symbologyStyleClass.AddItem(styleGalleryItem, 0);
symbologyStyleClass.SelectItem(0);
}
private void PreviewImage()
{
//Get and set the style class
ISymbologyStyleClass symbologyStyleClass = m_axSymbologyControl.GetStyleClass(m_axSymbologyControl.StyleClass);
//Preview an image of the symbol
stdole.IPictureDisp picture = symbologyStyleClass.PreviewItem(m_styleGalleryItem, pictureBox1.Width, pictureBox1.Height);
System.Drawing.Image image = System.Drawing.Image.FromHbitmap(new System.IntPtr(picture.Handle));
pictureBox1.Image = image;
}
private void OnItemSelected(object sender, ESRI.ArcGIS.Controls.ISymbologyControlEvents_OnItemSelectedEvent e)
{
//Preview the selected item
m_styleGalleryItem = (IStyleGalleryItem)e.styleGalleryItem;
PreviewImage();
//set the dirty flag
if (!IsPageActivating)
PageIsDirty = true;
}
private void SymbolSelectorPropPage_Shown(object sender, EventArgs e)
{
m_axSymbologyControl = new AxSymbologyControl();
m_axSymbologyControl.Parent = this;
m_axSymbologyControl.SetBounds(16, 38, 298, 369);
m_axSymbologyControl.Refresh();
m_axSymbologyControl.Update();
m_axSymbologyControl.OnItemSelected += new ISymbologyControlEvents_Ax_OnItemSelectedEventHandler(OnItemSelected);
LoadStyle();
}
private void LoadStyle()
{
try
{
if (null == m_axSymbologyControl)
return;
PropertySheet propSheet = Objects[0] as PropertySheet;
IFeatureLayer layer = propSheet.FeatureLayer;
if (null == layer)
return;
//Get the ArcGIS install location
string sInstall = ESRI.ArcGIS.RuntimeManager.ActiveRuntime.Path;
//Load the ESRI.ServerStyle file into the SymbologyControl
m_axSymbologyControl.LoadStyleFile(sInstall + "\\Styles\\ESRI.ServerStyle");
IGeoFeatureLayer geoFeatureLayer = (IGeoFeatureLayer)layer;
ISimpleRenderer simpleRenderer = (ISimpleRenderer)geoFeatureLayer.Renderer;
//set SymbologyStyle based upon feature type
switch (layer.FeatureClass.ShapeType)
{
case esriGeometryType.esriGeometryPoint:
SetFeatureClassStyle(esriSymbologyStyleClass.esriStyleClassMarkerSymbols, simpleRenderer.Symbol);
break;
case esriGeometryType.esriGeometryPolyline:
SetFeatureClassStyle(esriSymbologyStyleClass.esriStyleClassLineSymbols, simpleRenderer.Symbol);
break;
case esriGeometryType.esriGeometryPolygon:
SetFeatureClassStyle(esriSymbologyStyleClass.esriStyleClassFillSymbols, simpleRenderer.Symbol);
break;
}
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.Message);
}
}
private void btnMoreSymbols_Click(object sender, EventArgs e)
{
//load all available styles from the registry
//Get the ArcGIS install location
string sInstall = ESRI.ArcGIS.RuntimeManager.ActiveRuntime.Path;
string path = System.IO.Path.Combine(sInstall, "Styles");
string[] styleNames = System.IO.Directory.GetFiles(path, "*.ServerStyle");
MenuItem[] items = new MenuItem[styleNames.Length + 1];
for (int i = 0; i < styleNames.Length; i++)
{
items[i] = new MenuItem(System.IO.Path.GetFileNameWithoutExtension( styleNames[i] ));
//add the path as the item's name
items[i].Name = styleNames[i];
items[i].Click += new EventHandler(SymbolSelectorPropPage_Click);
}
items[styleNames.Length] = new MenuItem("More...", new EventHandler(AddStyleFromFile));
ContextMenu menu = new ContextMenu(items);
menu.Show(this, btnMoreSymbols.Location);
}
void SymbolSelectorPropPage_Click(object sender, EventArgs e)
{
MenuItem selectedItem = (MenuItem)sender;
//Load the style file into the SymbologyControl
m_axSymbologyControl.LoadStyleFile(selectedItem.Name);
m_axSymbologyControl.Refresh();
}
void AddStyleFromFile(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.CheckPathExists = true;
ofd.CheckFileExists = true;
ofd.RestoreDirectory = true;
ofd.Multiselect = false;
ofd.Title = "Select Style file";
ofd.Filter = "ESRI Style Set Files (*.ServerStyle)|*.ServerStyle";
if (ofd.ShowDialog() == DialogResult.OK)
{
//Load the style file into the SymbologyControl
m_axSymbologyControl.LoadStyleFile(ofd.FileName);
m_axSymbologyControl.Refresh();
}
}
private void btnReset_Click(object sender, EventArgs e)
{
m_axSymbologyControl.Clear();
LoadStyle();
m_axSymbologyControl.Refresh();
}
}
}
[Visual Basic .NET]
SymbolSelectorPropPage.vb
Imports Microsoft.VisualBasic
Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Text
Imports System.Windows.Forms
Imports System.Runtime.InteropServices
Imports ESRI.ArcGIS.Carto
Imports ESRI.ArcGIS.Controls
Imports ESRI.ArcGIS.Display
Imports ESRI.ArcGIS.Geometry
Imports ESRI.ArcGIS.SystemUI
Namespace SymbolSelector
<Guid("795FC5F5-4365-4cce-99C4-B5A3DDD1060A"), ComVisible(True), ProgId("SymbolSelector.SymbolSelectorPropPage"), ClassInterface(ClassInterfaceType.None)> _
Public Partial Class SymbolSelectorPropPage : Inherits PropertyPage
'private AxMapControl m_axMapPreview = null;
Private m_axSymbologyControl As AxSymbologyControl = Nothing
Public m_styleGalleryItem As IStyleGalleryItem
Public Sub New()
InitializeComponent()
Me.CreateControl()
End Sub
Protected Overrides Sub OnPageDeactivate()
MyBase.OnPageDeactivate()
'unwire the OnItemSelected event
RemoveHandler m_axSymbologyControl.OnItemSelected, AddressOf OnItemSelected
'dispose the control
m_axSymbologyControl.Dispose()
m_axSymbologyControl = Nothing
End Sub
Protected Overrides Sub OnPageApply()
MyBase.OnPageApply()
Dim propSheet As PropertySheet = TryCast(Objects(0), PropertySheet)
Dim layer As IFeatureLayer = propSheet.FeatureLayer
If Nothing Is layer Then
Return
End If
If m_styleGalleryItem Is Nothing Then
Return
End If
Dim geoFeatureLayer As IGeoFeatureLayer = CType(layer, IGeoFeatureLayer)
'Create a new renderer
Dim simpleRenderer As ISimpleRenderer = New SimpleRendererClass()
'Set its symbol from the styleGalleryItem
simpleRenderer.Symbol = CType(m_styleGalleryItem.Item, ISymbol)
'Set the renderer into the geoFeatureLayer
geoFeatureLayer.Renderer = CType(simpleRenderer, IFeatureRenderer)
'Make the PropertyPage class fire an event notifying that the layer's renderer has changed
propSheet.FireFeatureLayerRendererChanged()
End Sub
Protected Overrides Sub OnPageActivate(ByVal hWndParent As IntPtr, ByVal Rect As Rectangle, ByVal bModal As Boolean)
Try
MyBase.OnPageActivate(hWndParent, Rect, bModal)
LoadStyle()
Catch ex As Exception
System.Diagnostics.Trace.WriteLine(ex.Message)
End Try
End Sub
Private Sub SetFeatureClassStyle(ByVal styleClass As esriSymbologyStyleClass, ByVal symbol As ISymbol)
m_styleGalleryItem = Nothing
'Get and set the style class
m_axSymbologyControl.StyleClass = styleClass
Dim symbologyStyleClass As ISymbologyStyleClass = m_axSymbologyControl.GetStyleClass(styleClass)
'Create a new server style gallery item with its style set
Dim styleGalleryItem As IStyleGalleryItem = New ServerStyleGalleryItem()
styleGalleryItem.Item = symbol
styleGalleryItem.Name = "mySymbol"
'Add the item to the style class and select it
symbologyStyleClass.AddItem(styleGalleryItem, 0)
symbologyStyleClass.SelectItem(0)
End Sub
Private Sub PreviewImage()
'Get and set the style class
Dim symbologyStyleClass As ISymbologyStyleClass = m_axSymbologyControl.GetStyleClass(m_axSymbologyControl.StyleClass)
'Preview an image of the symbol
Dim picture As stdole.IPictureDisp = symbologyStyleClass.PreviewItem(m_styleGalleryItem, pictureBox1.Width, pictureBox1.Height)
Dim image As System.Drawing.Image = System.Drawing.Image.FromHbitmap(New System.IntPtr(picture.Handle))
pictureBox1.Image = image
End Sub
Private Sub OnItemSelected(ByVal sender As Object, ByVal e As ESRI.ArcGIS.Controls.ISymbologyControlEvents_OnItemSelectedEvent)
'Preview the selected item
m_styleGalleryItem = CType(e.styleGalleryItem, IStyleGalleryItem)
PreviewImage()
'set the dirty flag
If (Not IsPageActivating) Then
PageIsDirty = True
End If
End Sub
Private Sub SymbolSelectorPropPage_Shown(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Shown
m_axSymbologyControl = New AxSymbologyControl()
m_axSymbologyControl.Parent = Me
m_axSymbologyControl.SetBounds(16, 38, 298, 369)
m_axSymbologyControl.Refresh()
m_axSymbologyControl.Update()
AddHandler m_axSymbologyControl.OnItemSelected, AddressOf OnItemSelected
LoadStyle()
End Sub
Private Sub LoadStyle()
Try
If Nothing Is m_axSymbologyControl Then
Return
End If
Dim propSheet As PropertySheet = TryCast(Objects(0), PropertySheet)
Dim layer As IFeatureLayer = propSheet.FeatureLayer
If Nothing Is layer Then
Return
End If
'Get the ArcGIS install location
Dim sInstall As String = ESRI.ArcGIS.RuntimeManager.ActiveRuntime.Path
'Load the ESRI.ServerStyle file into the SymbologyControl
m_axSymbologyControl.LoadStyleFile(sInstall & "\Styles\ESRI.ServerStyle")
Dim geoFeatureLayer As IGeoFeatureLayer = CType(layer, IGeoFeatureLayer)
Dim simpleRenderer As ISimpleRenderer = CType(geoFeatureLayer.Renderer, ISimpleRenderer)
'set SymbologyStyle based upon feature type
Select Case layer.FeatureClass.ShapeType
Case esriGeometryType.esriGeometryPoint
SetFeatureClassStyle(esriSymbologyStyleClass.esriStyleClassMarkerSymbols, simpleRenderer.Symbol)
Case esriGeometryType.esriGeometryPolyline
SetFeatureClassStyle(esriSymbologyStyleClass.esriStyleClassLineSymbols, simpleRenderer.Symbol)
Case esriGeometryType.esriGeometryPolygon
SetFeatureClassStyle(esriSymbologyStyleClass.esriStyleClassFillSymbols, simpleRenderer.Symbol)
End Select
Catch ex As Exception
System.Diagnostics.Trace.WriteLine(ex.Message)
End Try
End Sub
Private Sub btnMoreSymbols_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnMoreSymbols.Click
'load all available styles
'Get the ArcGIS install location
Dim sInstall As String = ESRI.ArcGIS.RuntimeManager.ActiveRuntime.Path
Dim path As String = System.IO.Path.Combine(sInstall, "Styles")
Dim styleNames As String() = System.IO.Directory.GetFiles(path, "*.ServerStyle")
Dim items As MenuItem() = New MenuItem(styleNames.Length){}
Dim i As Integer = 0
Do While i < styleNames.Length
items(i) = New MenuItem(System.IO.Path.GetFileNameWithoutExtension(styleNames(i)))
'add the path as the item's name
items(i).Name = styleNames(i)
AddHandler items(i).Click, AddressOf SymbolSelectorPropPage_Click
i += 1
Loop
items(styleNames.Length) = New MenuItem("More...", New EventHandler(AddressOf AddStyleFromFile))
Dim menu As ContextMenu = New ContextMenu(items)
menu.Show(Me, btnMoreSymbols.Location)
End Sub
Private Sub SymbolSelectorPropPage_Click(ByVal sender As Object, ByVal e As EventArgs)
Dim selectedItem As MenuItem = CType(sender, MenuItem)
'Load the style file into the SymbologyControl
m_axSymbologyControl.LoadStyleFile(selectedItem.Name)
m_axSymbologyControl.Refresh()
End Sub
Private Sub AddStyleFromFile(ByVal sender As Object, ByVal e As EventArgs)
Dim ofd As OpenFileDialog = New OpenFileDialog()
ofd.CheckPathExists = True
ofd.CheckFileExists = True
ofd.RestoreDirectory = True
ofd.Multiselect = False
ofd.Title = "Select Style file"
ofd.Filter = "ESRI Style Set Files (*.ServerStyle)|*.ServerStyle"
If ofd.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
'Load the style file into the SymbologyControl
m_axSymbologyControl.LoadStyleFile(ofd.FileName)
m_axSymbologyControl.Refresh()
End If
End Sub
Private Sub btnReset_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnReset.Click
m_axSymbologyControl.Clear()
LoadStyle()
m_axSymbologyControl.Refresh()
End Sub
End Class
End Namespace