IDesignerEventService Interface

Definition

Provides event notifications when root designers are added and removed, when a selected component changes, and when the current root designer changes.

public interface class IDesignerEventService
public interface IDesignerEventService
type IDesignerEventService = interface
Public Interface IDesignerEventService

Examples

This example demonstrates a designer that uses the IDesignerEventService to display event notifications on a control. To use this example, compile the code to a class library. Add a reference to the library to a new Windows Forms project, and add the control within the library to the Toolbox. Add an instance of the DesignerMonitor control to a form in design mode. Right-click the control and click the Start monitoring command to display notifications of events raised by the IDesignerEventService.

#using <system.dll>
#using <system.design.dll>
#using <system.windows.forms.dll>
#using <system.drawing.dll>

using namespace System;
using namespace System::ComponentModel;
using namespace System::ComponentModel::Design;
using namespace System::Collections;
using namespace System::Drawing;
using namespace System::Windows::Forms;
using namespace System::Windows::Forms::Design;

namespace DesignerEventServiceExample
{
   ref class DesignerMonitorDesigner;

   // DesignerMonitor provides a display for designer event notifications.

   [Designer(DesignerEventServiceExample::DesignerMonitorDesigner::typeid)]
   public ref class DesignerMonitor: public UserControl
   {
   public:

      // List to contain strings that describe designer events.
      ArrayList^ updates;
      bool monitoring_events;
      DesignerMonitor()
      {
         monitoring_events = false;
         updates = gcnew ArrayList;
         this->BackColor = Color::White;
         this->Size = System::Drawing::Size( 450, 300 );
      }

   protected:

      // Display the message for the current mode, and any event messages if event monitoring is active.
      virtual void OnPaint( PaintEventArgs^ e ) override
      {
         e->Graphics->DrawString( "IDesignerEventService DesignerMonitor Control", gcnew System::Drawing::Font( FontFamily::GenericMonospace,10 ), gcnew SolidBrush( Color::Blue ), 5, 4 );
         int yoffset = 10;
         if (  !monitoring_events )
         {
            yoffset += 10;
            e->Graphics->DrawString( "Currently not monitoring designer events.", gcnew System::Drawing::Font( FontFamily::GenericMonospace,10 ), gcnew SolidBrush( Color::Black ), 5.f, yoffset + 10.f );
            e->Graphics->DrawString( "Use the shortcut menu commands", gcnew System::Drawing::Font( FontFamily::GenericMonospace,10 ), gcnew SolidBrush( Color::Black ), 5.f, yoffset + 30.f );
            e->Graphics->DrawString( "provided by an associated DesignerMonitorDesigner", gcnew System::Drawing::Font( FontFamily::GenericMonospace,10 ), gcnew SolidBrush( Color::Black ), 5.f, yoffset + 40.f );
            e->Graphics->DrawString( "to start or stop monitoring.", gcnew System::Drawing::Font( FontFamily::GenericMonospace,10 ), gcnew SolidBrush( Color::Black ), 5.f, yoffset + 50.f );
         }
         else
         {
            e->Graphics->DrawString( "Currently monitoring designer events.", gcnew System::Drawing::Font( FontFamily::GenericMonospace,10 ), gcnew SolidBrush( Color::DarkBlue ), 5.f, yoffset + 10.f );
            e->Graphics->DrawString( "Designer created, changed and disposed events:", gcnew System::Drawing::Font( FontFamily::GenericMonospace,9 ), gcnew SolidBrush( Color::Brown ), 5.f, yoffset + 35.f );
            for ( int i = 0; i < updates->Count; i++ )
            {
               e->Graphics->DrawString( static_cast<String^>(updates[ i ]), gcnew System::Drawing::Font( FontFamily::GenericMonospace,8 ), gcnew SolidBrush( Color::Black ), 5.f, yoffset + 55.f + (10 * i) );
               yoffset += 10;
            }
         }
      }
   };

   // DesignerMonitorDesigner uses the IDesignerEventService to send event information
   // to an associated DesignerMonitor control's updates collection.
   public ref class DesignerMonitorDesigner: public ControlDesigner
   {
   private:
      DesignerMonitor^ dm;
      DesignerVerbCollection^ dvc;
      int eventcount;
      void StopMonitoring( Object^ /*sender*/, EventArgs^ /*e*/ )
      {
         IDesignerEventService^ des = dynamic_cast<IDesignerEventService^>(this->Control->Site->GetService( IDesignerEventService::typeid ));
         if ( des != nullptr )
         {
            // Remove event handlers for event notification methods.
            des->DesignerCreated -= gcnew DesignerEventHandler( this, &DesignerMonitorDesigner::DesignerCreated );
            des->DesignerDisposed -= gcnew DesignerEventHandler( this, &DesignerMonitorDesigner::DesignerDisposed );
            des->ActiveDesignerChanged -= gcnew ActiveDesignerEventHandler( this, &DesignerMonitorDesigner::DesignerChanged );
            des->SelectionChanged -= gcnew EventHandler( this, &DesignerMonitorDesigner::SelectionChanged );
            dm->monitoring_events = false;

            // Rebuild menu with "Start monitoring" command.
            array<DesignerVerb^>^myArray = {gcnew DesignerVerb( "Start monitoring",gcnew EventHandler( this, &DesignerMonitorDesigner::StartMonitoring ) )};
            dvc = gcnew DesignerVerbCollection( myArray );
            dm->Refresh();
         }
      }

      void StartMonitoring( Object^ /*sender*/, EventArgs^ /*e*/ )
      {
         IDesignerEventService^ des = dynamic_cast<IDesignerEventService^>(this->Control->Site->GetService( IDesignerEventService::typeid ));
         if ( des != nullptr )
         {
            // Add event handlers for event notification methods.
            des->DesignerCreated += gcnew DesignerEventHandler( this, &DesignerMonitorDesigner::DesignerCreated );
            des->DesignerDisposed += gcnew DesignerEventHandler( this, &DesignerMonitorDesigner::DesignerDisposed );
            des->ActiveDesignerChanged += gcnew ActiveDesignerEventHandler( this, &DesignerMonitorDesigner::DesignerChanged );
            des->SelectionChanged += gcnew EventHandler( this, &DesignerMonitorDesigner::SelectionChanged );
            dm->monitoring_events = false;

            // Rebuild menu with "Stop monitoring" command.
            array<DesignerVerb^>^myArray = {gcnew DesignerVerb( "Stop monitoring",gcnew EventHandler( this, &DesignerMonitorDesigner::StopMonitoring ) )};
            dvc = gcnew DesignerVerbCollection( myArray );
            dm->Refresh();
         }
      }

      void DesignerCreated( Object^ /*sender*/, DesignerEventArgs^ e )
      {
         UpdateStatus( "Designer for " + e->Designer->RootComponent->Site->Name + " was created." );
      }

      void DesignerDisposed( Object^ /*sender*/, DesignerEventArgs^ e )
      {
         UpdateStatus( "Designer for " + e->Designer->RootComponent->Site->Name + " was disposed." );
      }

      void DesignerChanged( Object^ /*sender*/, ActiveDesignerEventArgs^ e )
      {
         UpdateStatus( "Active designer moved from " + e->OldDesigner->RootComponent->Site->Name + " to " + e->NewDesigner->RootComponent->Site->Name + "." );
      }

      void SelectionChanged( Object^ /*sender*/, EventArgs^ /*e*/ )
      {
         UpdateStatus("A component selection was changed.");
      }

      // Update message buffer on DesignerMonitor control.
      void UpdateStatus( String^ newmsg )
      {
         if ( dm->updates->Count > 10 )
                  dm->updates->RemoveAt( 10 );

         dm->updates->Insert( 0, "Event #" + eventcount.ToString() + ": " + newmsg );
         eventcount++;
         dm->Refresh();
      }
   };
}
Imports System.Collections
Imports System.ComponentModel
Imports System.ComponentModel.Design
Imports System.Drawing
Imports System.Windows.Forms
Imports System.Windows.Forms.Design

Namespace DesignerEventServiceExample

    ' DesignerMonitor provides a display for designer event notifications.
    <Designer(GetType(DesignerMonitorDesigner))> _
    Public Class DesignerMonitor
        Inherits System.Windows.Forms.UserControl

        ' List to contain strings that describe designer events.
        Public updates As ArrayList
        Public monitoring_events As Boolean = False

        Public Sub New()
            updates = New ArrayList()
            Me.BackColor = Color.Beige
            Me.Size = New Size(450, 300)
        End Sub    

        ' Display the message for the current mode, and any event messages if monitoring events
        Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
            e.Graphics.DrawString("IDesignerEventService DesignerMonitor control", New Font(FontFamily.GenericMonospace, 10), New SolidBrush(Color.Red), 5, 4)
            Dim yoffset As Integer = 10
            If Not monitoring_events Then
                yoffset += 10
                e.Graphics.DrawString("Currently not monitoring designer events.", New Font(FontFamily.GenericMonospace, 10), New SolidBrush(Color.Black), 5, yoffset + 10)
                e.Graphics.DrawString("Use the shortcut menu commands", New Font(FontFamily.GenericMonospace, 10), New SolidBrush(Color.Black), 5, yoffset + 30)
                e.Graphics.DrawString("provided by an associated DesignerMonitorDesigner", New Font(FontFamily.GenericMonospace, 10), New SolidBrush(Color.Black), 5, yoffset + 40)
                e.Graphics.DrawString("to start or stop monitoring.", New Font(FontFamily.GenericMonospace, 10), New SolidBrush(Color.Black), 5, yoffset + 50)
            Else
                e.Graphics.DrawString("Currently monitoring designer events.", New Font(FontFamily.GenericMonospace, 10), New SolidBrush(Color.DarkBlue), 5, yoffset + 10)
                e.Graphics.DrawString("Designer created, changed and disposed events:", New Font(FontFamily.GenericMonospace, 9), New SolidBrush(Color.Brown), 5, yoffset + 35)
                Dim i As Integer
                For i = 0 To updates.Count - 1
                    e.Graphics.DrawString(CStr(updates(i)), New Font(FontFamily.GenericMonospace, 8), New SolidBrush(Color.Black), 5, yoffset + 55 + 10 * i)
                    yoffset += 10
                Next i
            End If
        End Sub 
    End Class   

    ' DesignerMonitorDesigner uses the IDesignerEventService to send event information 
    ' to an associated DesignerMonitor control's updates collection.
    Public Class DesignerMonitorDesigner
        Inherits System.Windows.Forms.Design.ControlDesigner
        Private dm As DesignerMonitor = Nothing
        Private dvc As DesignerVerbCollection = Nothing
        Private eventcount As Integer = 0

        Public Sub New()
            ' Initializes the designer's shortcut menu with a "Start monitoring" command.
            dvc = New DesignerVerbCollection(New DesignerVerb() {New DesignerVerb("Start monitoring", AddressOf Me.StartMonitoring)})
        End Sub  

        Public Overrides Sub Initialize(ByVal component As System.ComponentModel.IComponent)
            MyBase.Initialize(component)

            Dim o As Object
            o = component
            
            If o.GetType() IsNot GetType(DesignerMonitor) Then
                Throw New Exception("This designer requires a DesignerMonitor control.")
            End If
            dm = CType(component, DesignerMonitor)
        End Sub   

        Public Overrides ReadOnly Property Verbs() As System.ComponentModel.Design.DesignerVerbCollection
            Get
                Return dvc
            End Get
        End Property

        Private Sub StopMonitoring(ByVal sender As Object, ByVal e As EventArgs)
            Dim des As IDesignerEventService = CType(Me.Control.Site.GetService(GetType(IDesignerEventService)), IDesignerEventService)
            If des Is Nothing Then
                Return
            End If
            ' Remove event handlers for event notification methods.
            RemoveHandler des.DesignerCreated, AddressOf Me.DesignerCreated
            RemoveHandler des.DesignerDisposed, AddressOf Me.DesignerDisposed
            RemoveHandler des.ActiveDesignerChanged, AddressOf Me.DesignerChanged
            RemoveHandler des.SelectionChanged, AddressOf Me.SelectionChanged

            dm.monitoring_events = False
            ' Rebuild menu with "Start monitoring" command.
            dvc = New DesignerVerbCollection(New DesignerVerb() {New DesignerVerb("Start monitoring", AddressOf Me.StartMonitoring)})
            dm.Refresh()
        End Sub 

        Private Sub StartMonitoring(ByVal sender As Object, ByVal e As EventArgs)
            Dim des As IDesignerEventService = CType(Me.Control.Site.GetService(GetType(IDesignerEventService)), IDesignerEventService)
            If des Is Nothing Then
                Return
            End If
            ' Add event handlers for event notification methods.
            AddHandler des.DesignerCreated, AddressOf Me.DesignerCreated
            AddHandler des.DesignerDisposed, AddressOf Me.DesignerDisposed
            AddHandler des.ActiveDesignerChanged, AddressOf Me.DesignerChanged
            AddHandler des.SelectionChanged, AddressOf Me.SelectionChanged

            dm.monitoring_events = True
            ' Rebuild menu with "Stop monitoring" command.
            dvc = New DesignerVerbCollection(New DesignerVerb() {New DesignerVerb("Stop monitoring", AddressOf Me.StopMonitoring)})
            dm.Refresh()
        End Sub      

        Private Sub DesignerCreated(ByVal sender As Object, ByVal e As DesignerEventArgs)
            UpdateStatus(("Designer for " + e.Designer.RootComponent.Site.Name + " was created."))
        End Sub     

        Private Sub DesignerDisposed(ByVal sender As Object, ByVal e As DesignerEventArgs)
            UpdateStatus(("Designer for " + e.Designer.RootComponent.Site.Name + " was disposed."))
        End Sub 

        Private Sub DesignerChanged(ByVal sender As Object, ByVal e As ActiveDesignerEventArgs)
            UpdateStatus(("Active designer moved from " + e.OldDesigner.RootComponent.Site.Name + " to " + e.NewDesigner.RootComponent.Site.Name + "."))
        End Sub    

        Private Sub SelectionChanged(ByVal sender As Object, ByVal e As EventArgs)
            UpdateStatus("A component selection was changed.")
        End Sub       

        ' Update message buffer on DesignerMonitor control.
        Private Sub UpdateStatus(ByVal newmsg As String)
            If dm.updates.Count > 10 Then
                dm.updates.RemoveAt(10)
            End If
            dm.updates.Insert(0, "Event #" + eventcount.ToString() + ": " + newmsg)
            eventcount += 1
            dm.Refresh()
        End Sub 

    End Class 
End Namespace 

Remarks

IDesignerEventService provides notification when a new root designer is created, changed, or disposed. A root designer provides design time support for the base component of a document in designer view. The SelectionChanged event provides notification when the current component selection has changed.

Properties

ActiveDesigner

Gets the root designer for the currently active document.

Designers

Gets a collection of root designers for design documents that are currently active in the development environment.

Events

ActiveDesignerChanged

Occurs when the current root designer changes.

DesignerCreated

Occurs when a root designer is created.

DesignerDisposed

Occurs when a root designer for a document is disposed.

SelectionChanged

Occurs when the current design-view selection changes.

Applies to

See also