您的代码运行良好,但我的RemoveHandler部分不起作用...在我的窗体中,我有一个“关闭”按钮,它关闭了“RemoveHandler”部分。即使在触发“RemoveHandler”之后,程序仍然发出“CommandWillStart”事件。这是我到目前为止写的(相当简单的)有问题的代码。我砍掉了大部分与事件处理程序无关的代码。关于“RemoveHandler”函数有什么不一致的地方吗?非常感谢你的帮助...谢谢!
- Imports Autodesk.AutoCAD.ApplicationServices
- Imports Autodesk.AutoCAD.ApplicationServices.Core.Application
- Imports Autodesk.AutoCAD.DatabaseServices
- Imports Autodesk.AutoCAD.Geometry
- Imports Autodesk.AutoCAD.EditorInput
- Imports Autodesk.AutoCAD.ApplicationServices.Application
- Imports System.Windows.Forms
- Imports Autodesk.AutoCAD.Colors
- Imports System.IO
- Imports Autodesk.AutoCAD.Runtime
- Public Class Form1
- Implements IExtensionApplication
- Private CurrentLayerName As String
- Private _SelectedLayer As LayerData
- Private Shared acDoc As Document
- Public Sub Initialize() Implements IExtensionApplication.Initialize
- Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("Initialize")
- acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
- End Sub
-
- Public Sub Terminate() Implements IExtensionApplication.Terminate
- End Sub
- Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- _SelectedLayer = New LayerData
- End Sub
- Private Sub myOnButton_Click(ByVal sender As Object, ByVal e As EventArgs) Handles myOnButton.Click
- AddHandler acDoc.CommandWillStart, AddressOf SwapTheLayer
- End Sub
-
- Private Sub OFF_Button_Click(ByVal sender As Object, ByVal e As EventArgs) Handles OFF_Button.Click
- RemoveHandler acDoc.CommandWillStart, AddressOf SwapTheLayer
- End Sub
- Private Sub SwapTheLayer(ByVal senderObj As Object, ByVal e As CommandEventArgs)
- CurrentLayerName = Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("CLAYER")
- Dim importedLayer As Array = _SelectedLayer.ToArray
- Select Case e.GlobalCommandName
- Case "MTEXT"
- If checkIfLayerExistInDrawing(MText_TextBox.Text) = True Then
- Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("layer exist")
- Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("CLAYER", MText_TextBox.Text.ToString)
- Else
- Dim myCreateLay As New CreateLayer(importedLayer(0).MyLayerName,
- importedLayer(0).MyLayerDescription,
- importedLayer(0).MyLayerColor,
- importedLayer(0).MyLayerPlot,
- importedLayer(0).MyLayerLinetypeName,
- importedLayer(0).MyLayerLineweight)
- Autodesk.AutoCAD.ApplicationServices.Core.Application.SetSystemVariable("CLAYER", MText_TextBox.Text)
- Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("layer do not exist in drawing")
- End If
- Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("AddHandler CommandEnded")
- AddHandler acDoc.CommandEnded, AddressOf BackToOriginalLayer
- AddHandler acDoc.CommandCancelled, AddressOf BackToOriginalLayer
- AddHandler acDoc.CommandFailed, AddressOf BackToOriginalLayer
- End Select
- End Sub
- Private Sub BackToOriginalLayer(ByVal senderObj As Object, ByVal e As CommandEventArgs)
- Select Case e.GlobalCommandName
- Case Is = "MTEXT"
- Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("CLAYER", CurrentLayerName)
- Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("RemoveHandler CommandEnded")
- RemoveHandler acDoc.CommandEnded, AddressOf BackToOriginalLayer
- RemoveHandler acDoc.CommandCancelled, AddressOf BackToOriginalLayer
- RemoveHandler acDoc.CommandFailed, AddressOf BackToOriginalLayer
- End Select
- End Sub
- Private Function checkIfLayerExistInDrawing(ByVal myLayerName As String)
- Dim LayerExist As Boolean
- '' Get the current document and database
- Dim acCurDb As Database = acDoc.Database
- '' Start a transaction
- Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
- '' Open the Layer table for read
- Dim acLyrTbl As LayerTable
- acLyrTbl = acTrans.GetObject(acCurDb.LayerTableId, OpenMode.ForRead)
- 'layer exist in drawing...
- If acLyrTbl.Has(myLayerName) = False Then
- LayerExist = False
- Else
- LayerExist = True
- End If
- End Using
- Return LayerExist
- End Function
- End Class
|