Как написать исходный код из Custom Control Designer? - PullRequest
0 голосов
/ 26 сентября 2019

Я пытаюсь создать пользовательский элемент управления, который будет изменять некоторый исходный код, сгенерированный шаблоном.

Я попытался получить расположение сборки из созданного мной пользовательского элемента ControlDesign, но это Visual Studio .exeместоположение, а не местоположение исходного кода.

        Private Designer As BulkOpsVesselGridControlDesigner

        Public Sub New(ByVal Designer As BulkOpsVesselGridControlDesigner)
            MyBase.New(Designer.Component)
            Me.Designer = Designer
        End Sub

        Public Property GridType() As BulkOpsGrids
            Get
                Return Me.Designer.VesselGridControl.GridType
            End Get
            Set(ByVal value As BulkOpsGrids)
                Me.Designer.VesselGridControl.GridType = value

                If value = BulkOpsGrids.NewGrid Then
                    'Display Input from Developer
                    Dim gridName = InputBox("Please Type out the name of the Grid Type Without Spaces. Ex: WorkingCrane")
                    'TODO: Get file path programmatically (based on developer)
                    Dim path = "C:\BulkOpsWinUILib\UserControls\GridPropertyData\BulkOpsGridData.vb"

                    Dim fileExists As Boolean = IO.File.Exists(path)
                    Using sw As New IO.StreamWriter(IO.File.Open(path, IO.FileMode.OpenOrCreate))
                        'TODO: write logic for formatting and proper placedment
                        sw.WriteLine(gridName)
                    End Using
                End If
            End Set
        End Property

В конечном счете, я хотел бы, чтобы разработчик выбрал опцию "newGrid", я хотел бы, чтобы он автоматически запрашивал детали для определения сетки, а затем добавлял опцию кправильный исходный код.

Надежда состоит в том, чтобы создать шаблон, который можно использовать для стандартизации того, как мы создадим эти элементы управления в будущих приложениях.Сам шаблон поможет создавать и создавать исходный код по мере необходимости.Аналогично тому, как конструктор автоматически записывает в файл .designer.

Изображение структуры файла

1 Ответ

0 голосов
/ 27 сентября 2019

Звучит так, как будто вы хотите автоматизировать Visual Studio из кода конструктора элемента управления.Вы можете получить ссылку на Интерфейс DTE , используя IServiceProvider.GetService (Type) Метод . Свойство сайта компонента *1005* реализует интерфейс IServiceProvider.

Получив ссылку на DTE, вы можете получить информацию о загруженном в данный момент решении и сделать все, что позволяет модель объекта VS, включая добавлениеНовые элементы в проекте.

Приведенный ниже пример в значительной степени основан на вопросе и показывает, как получить различную информацию о пути, которая соответствует тому, о чем вы спрашиваете.Модуль смарт-тега SomeProp устанавливает текстовое свойство пользовательской метки для отображения полученной информации.

' Project References:
'   • System.Design
'   • ENVDTE

Imports System.ComponentModel
Imports System.ComponentModel.Design
Imports System.Windows.Forms.Design

<Designer(GetType(TestControlDesigner))>
Public Class TestControl : Inherits Label
  Public Sub New()
    AutoSize = True
  End Sub
End Class

Public Class TestControlDesigner : Inherits ControlDesigner
  Private _actionLists As DesignerActionListCollection

  Public Overrides ReadOnly Property ActionLists As DesignerActionListCollection
    Get
      If _actionLists Is Nothing Then
        _actionLists = New DesignerActionListCollection({New MyActions(Me.Component)})
      End If
      Return _actionLists
    End Get
  End Property

  Private Class MyActions : Inherits DesignerActionList
    Public Sub New(component As System.ComponentModel.IComponent)
      MyBase.New(component)
    End Sub

    Private _SomeProp As String
    Public Property SomeProp As String
      Get
        Return _SomeProp
      End Get
      Set(value As String)
        _SomeProp = value
        Dim serviceProvider As IServiceProvider = Me.Component.Site
        Dim dte As EnvDTE.DTE = CType(serviceProvider.GetService(GetType(EnvDTE.DTE)), EnvDTE.DTE)
        Dim doc As EnvDTE.Document = dte.ActiveDocument
        Dim proj As EnvDTE.Project = doc.ProjectItem.ContainingProject
        Dim cntrl As Control = CType(Me.Component, Control)
        Dim sb As New System.Text.StringBuilder(1000)
        sb.Append($"Document Path: {doc.Path} {Environment.NewLine}")
        sb.Append($"Document Fullname: {doc.FullName} {Environment.NewLine}")
        sb.Append($"Project Filename: {proj.Properties.Item("FileName").Value} {Environment.NewLine}")
        sb.Append($"Project File Path: {proj.Properties.Item("LocalPath").Value} {Environment.NewLine}")
        cntrl.Text = sb.ToString()
      End Set
    End Property
  End Class
End Class
...