About the Layer property page and property sheet Sample
[C#]
LayerVisibilityPage.cs
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; using ESRI.ArcGIS.Framework; using ESRI.ArcGIS.ADF.CATIDs; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.esriSystem; namespace DesktopPropertyPageCS { /// <summary> /// Layer property page implementation for ArcMap, ArcScene or ArcGlobe. /// </summary> [Guid("7b01b172-57e4-4986-9650-d44b799180f3")] [ClassInterface(ClassInterfaceType.None)] [ProgId("DesktopPropertyPageCS.LayerVisibilityPage")] public partial class LayerVisibilityPage : UserControl, IComPropertyPage { #region COM Registration Function(s) [ComRegisterFunction()] [ComVisible(false)] static void RegisterFunction(Type registerType) { // Required for ArcGIS Component Category Registrar support ArcGISCategoryRegistration(registerType); // // TODO: Add any COM registration code here // } [ComUnregisterFunction()] [ComVisible(false)] static void UnregisterFunction(Type registerType) { // Required for ArcGIS Component Category Registrar support ArcGISCategoryUnregistration(registerType); // // TODO: Add any COM unregistration code here // } #region ArcGIS Component Category Registrar generated code /// <summary> /// Required method for ArcGIS Component Category registration - /// Do not modify the contents of this method with the code editor. /// </summary> private static void ArcGISCategoryRegistration(Type registerType) { string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID); LayerPropertyPages.Register(regKey); SxLayerPropertyPages.Register(regKey); GMxLayerPropertyPages.Register(regKey); } /// <summary> /// Required method for ArcGIS Component Category unregistration - /// Do not modify the contents of this method with the code editor. /// </summary> private static void ArcGISCategoryUnregistration(Type registerType) { string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID); LayerPropertyPages.Unregister(regKey); SxLayerPropertyPages.Unregister(regKey); GMxLayerPropertyPages.Unregister(regKey); } #endregion #endregion private bool m_dirtyFlag = false; private string m_pageTitle; private IComPropertyPageSite m_pageSite = null; private ILayer m_targetLayer = null; private IActiveView m_activeView = null; public LayerVisibilityPage() { InitializeComponent(); m_pageTitle = "Layer Visibility (C#)"; } /// <summary> /// Helper function to set dirty flag whenever changes are made to the page /// </summary> private void SetPageDirty(bool dirty) { if (m_dirtyFlag != dirty) { m_dirtyFlag = dirty; if (m_pageSite != null) m_pageSite.PageChanged(); } } /// <summary> /// Example: update dirty flag when check state of radio button /// (which controls layer visibility) changes /// </summary> private void radioButtonShow_CheckedChanged(object sender, EventArgs e) { SetPageDirty(true); } #region IComPropertyPage Members string IComPropertyPage.Title { get { return m_pageTitle; } set { //TODO: Uncomment if title can be modified //m_pageTitle = value; } } int IComPropertyPage.Width { get { return this.Width; } } int IComPropertyPage.Height { get { return this.Height; } } IComPropertyPageSite IComPropertyPage.PageSite { set { m_pageSite = value; } } /// <summary> /// Indicates if the page applies to the specified objects /// Do not hold on to the objects here. /// </summary> bool IComPropertyPage.Applies(ESRI.ArcGIS.esriSystem.ISet objects) { if (objects == null || objects.Count == 0) return false; bool isEditable = false; objects.Reset(); object testObject; while ((testObject = objects.Next()) != null) { if (testObject is ILayer) { isEditable = true; break; } } return isEditable; } /// <summary> /// Supplies the page with the object(s) to be edited /// </summary> void IComPropertyPage.SetObjects(ESRI.ArcGIS.esriSystem.ISet objects) { if (objects == null || objects.Count == 0) return; m_activeView = null; m_targetLayer = null; objects.Reset(); object testObject; while ((testObject = objects.Next()) != null) { if (testObject is ILayer) m_targetLayer = testObject as ILayer; else if (testObject is IActiveView) m_activeView = testObject as IActiveView; //else //{ //IApplication app = testObject as IApplication //Use if needed //} } } /// <summary> /// Indicates if the Apply button should be enabled /// </summary> bool IComPropertyPage.IsPageDirty { get { return m_dirtyFlag; } } int IComPropertyPage.Activate() { //Set up page UI based on layer visibility if (m_targetLayer.Visible) radioButtonShow.Checked = true; else radioButtonHide.Checked = true; SetPageDirty(false); return this.Handle.ToInt32(); } void IComPropertyPage.Deactivate() { m_targetLayer = null; m_activeView = null; this.Dispose(true); } void IComPropertyPage.Apply() { if (m_dirtyFlag) { //Set layer visibility m_targetLayer.Visible = radioButtonShow.Checked; //Refresh display after changes are made if (m_activeView != null) { m_activeView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null); m_activeView.ContentsChanged(); //notify clients listening to active view events, e.g. Source tab in the TOC } SetPageDirty(false); } } void IComPropertyPage.Cancel() { if (m_dirtyFlag) { //Reset UI or any temporary changes made to layer radioButtonShow.Checked = m_targetLayer.Visible; SetPageDirty(false); } } void IComPropertyPage.Show() { } void IComPropertyPage.Hide() { } string IComPropertyPage.HelpFile { get { return string.Empty; } } int IComPropertyPage.get_HelpContextID(int controlID) { return 0; } int IComPropertyPage.Priority { get { return 0; } set { } } #endregion } }
[Visual Basic .NET]
LayerVisibilityPage.vb
Imports System.Runtime.InteropServices Imports ESRI.ArcGIS.esriSystem Imports ESRI.ArcGIS.SystemUI Imports ESRI.ArcGIS.Framework Imports ESRI.ArcGIS.ADF.CATIDs Imports ESRI.ArcGIS.Carto ''' <summary> ''' Layer property page implementation for ArcMap, ArcScene or ArcGlobe. ''' </summary> <ComClass(LayerVisibilityPage.ClassId, LayerVisibilityPage.InterfaceId, LayerVisibilityPage.EventsId), _ ProgId("DesktopPropertyPageVB.LayerVisibilityPage")> _ Public Class LayerVisibilityPage Implements IComPropertyPage #Region "COM GUIDs" ' These GUIDs provide the COM identity for this class ' and its COM interfaces. If you change them, existing ' clients will no longer be able to access the class. Public Const ClassId As String = "80c42689-3b85-44a4-9b04-9ba0390109f7" Public Const InterfaceId As String = "cd3588f5-60ba-4a8b-9082-0f6f502dceb4" Public Const EventsId As String = "7e17322f-8495-4d80-b275-d15824d536fa" #End Region #Region "COM Registration Function(s)" <ComRegisterFunction(), ComVisibleAttribute(False)> _ Public Shared Sub RegisterFunction(ByVal registerType As Type) ' Required for ArcGIS Component Category Registrar support ArcGISCategoryRegistration(registerType) 'Add any COM registration code after the ArcGISCategoryRegistration() call End Sub <ComUnregisterFunction(), ComVisibleAttribute(False)> _ Public Shared Sub UnregisterFunction(ByVal registerType As Type) ' Required for ArcGIS Component Category Registrar support ArcGISCategoryUnregistration(registerType) 'Add any COM unregistration code after the ArcGISCategoryUnregistration() call End Sub #Region "ArcGIS Component Category Registrar generated code" ''' <summary> ''' Required method for ArcGIS Component Category registration - ''' Do not modify the contents of this method with the code editor. ''' </summary> Private Shared Sub ArcGISCategoryRegistration(ByVal registerType As Type) Dim regKey As String = String.Format("HKEY_CLASSES_ROOT\CLSID\{{{0}}}", registerType.GUID) SxLayerPropertyPages.Register(regKey) GMxLayerPropertyPages.Register(regKey) LayerPropertyPages.Register(regKey) End Sub ''' <summary> ''' Required method for ArcGIS Component Category unregistration - ''' Do not modify the contents of this method with the code editor. ''' </summary> Private Shared Sub ArcGISCategoryUnregistration(ByVal registerType As Type) Dim regKey As String = String.Format("HKEY_CLASSES_ROOT\CLSID\{{{0}}}", registerType.GUID) SxLayerPropertyPages.Unregister(regKey) GMxLayerPropertyPages.Unregister(regKey) LayerPropertyPages.Unregister(regKey) End Sub #End Region #End Region Private m_pageTitle As String Private m_dirtyFlag As Boolean = False Private m_pageSite As IComPropertyPageSite Private m_targetLayer As ILayer Private m_activeView As IActiveView Public Sub New() ' This call is required by the Windows Form Designer. InitializeComponent() ' Add any initialization after the InitializeComponent() call. m_pageTitle = "Layer Visibility (VB.Net)" End Sub ''' <summary> ''' Call this to set dirty flag whenever changes are made to the UI/page ''' </summary> Private Sub SetPageDirty(ByVal dirty As Boolean) If m_dirtyFlag <> dirty Then m_dirtyFlag = dirty If Not m_pageSite Is Nothing Then m_pageSite.PageChanged() End If End If End Sub ''' <summary> ''' Example: update dirty flag when check state of radio button ''' (which controls layer visibility) changes ''' </summary> Private Sub radioButtonShow_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles radioButtonShow.CheckedChanged SetPageDirty(True) End Sub #Region "IComPropertyPage Members" Public Function Activate() As Integer Implements ESRI.ArcGIS.Framework.IComPropertyPage.Activate 'Set up page UI based on layer visibility If m_targetLayer.Visible Then radioButtonShow.Checked = True Else radioButtonHide.Checked = True End If SetPageDirty(False) Return Me.Handle.ToInt32() End Function ''' <summary> ''' Indicates if the page applies to the specified objects ''' Do not hold on to the objects here. ''' </summary> Public Function Applies(ByVal objects As ESRI.ArcGIS.esriSystem.ISet) As Boolean Implements ESRI.ArcGIS.Framework.IComPropertyPage.Applies If objects Is Nothing Then Return False If objects.Count = 0 Then Return False Dim isEditable As Boolean = False objects.Reset() Dim testObject As Object = objects.Next() Do Until testObject Is Nothing If TypeOf testObject Is ILayer Then isEditable = True Exit Do End If testObject = objects.Next() Loop Return isEditable End Function Public Sub Apply() Implements ESRI.ArcGIS.Framework.IComPropertyPage.Apply If m_dirtyFlag Then 'Set layer visibility m_targetLayer.Visible = radioButtonShow.Checked 'Refresh display after changes are made If Not m_activeView Is Nothing Then m_activeView.PartialRefresh(esriViewDrawPhase.esriViewGeography, Nothing, Nothing) m_activeView.ContentsChanged() 'update TOC End If SetPageDirty(False) End If End Sub Public Sub Cancel() Implements ESRI.ArcGIS.Framework.IComPropertyPage.Cancel If m_dirtyFlag Then 'Reset UI or any temporary changes made to layer radioButtonShow.Checked = m_targetLayer.Visible SetPageDirty(False) End If End Sub Public Sub Deactivate() Implements ESRI.ArcGIS.Framework.IComPropertyPage.Deactivate m_targetLayer = Nothing m_activeView = Nothing Me.Dispose(True) End Sub Public ReadOnly Property Height1() As Integer Implements ESRI.ArcGIS.Framework.IComPropertyPage.Height Get Return Me.Height End Get End Property Public ReadOnly Property HelpContextID(ByVal controlID As Integer) As Integer Implements ESRI.ArcGIS.Framework.IComPropertyPage.HelpContextID Get Return 0 End Get End Property Public ReadOnly Property HelpFile() As String Implements ESRI.ArcGIS.Framework.IComPropertyPage.HelpFile Get Return String.Empty End Get End Property Public Sub Hide1() Implements ESRI.ArcGIS.Framework.IComPropertyPage.Hide End Sub ''' <summary> ''' Indicates if the Apply button should be enabled ''' </summary> Public ReadOnly Property IsPageDirty() As Boolean Implements ESRI.ArcGIS.Framework.IComPropertyPage.IsPageDirty Get Return m_dirtyFlag End Get End Property Public WriteOnly Property PageSite() As ESRI.ArcGIS.Framework.IComPropertyPageSite Implements ESRI.ArcGIS.Framework.IComPropertyPage.PageSite Set(ByVal value As ESRI.ArcGIS.Framework.IComPropertyPageSite) m_pageSite = value End Set End Property Public Property Priority() As Integer Implements ESRI.ArcGIS.Framework.IComPropertyPage.Priority Get Return 0 End Get Set(ByVal value As Integer) End Set End Property ''' <summary> ''' Supplies the page with the object(s) to be edited ''' </summary> Public Sub SetObjects(ByVal objects As ESRI.ArcGIS.esriSystem.ISet) Implements ESRI.ArcGIS.Framework.IComPropertyPage.SetObjects If objects Is Nothing Then Return If objects.Count = 0 Then Return m_targetLayer = Nothing m_activeView = Nothing objects.Reset() Dim testObject As Object = objects.Next() Do Until testObject Is Nothing If TypeOf testObject Is ILayer Then m_targetLayer = CType(testObject, ILayer) ElseIf TypeOf testObject Is IActiveView Then m_activeView = CType(testObject, IActiveView) End If testObject = objects.Next() Loop End Sub Public Sub Show1() Implements ESRI.ArcGIS.Framework.IComPropertyPage.Show End Sub Public Property Title() As String Implements ESRI.ArcGIS.Framework.IComPropertyPage.Title Get Return m_pageTitle End Get Set(ByVal value As String) 'TODO: Uncomment if title can be modified 'm_pageTitle = value End Set End Property Public ReadOnly Property Width1() As Integer Implements ESRI.ArcGIS.Framework.IComPropertyPage.Width Get Return Me.Width End Get End Property #End Region End Class