Свойства пользовательского дизайна Windows Forms

#.net #winforms #windows-forms-designer

#.net #winforms #windows-forms-designer

Вопрос:

Этот вопрос мучает меня уже несколько лет.

В нашем проекте мы используем производные компоненты и элементы управления Windows Forms. Например, мы получили их из Button, UserControl и т.д.

Наша производная кнопка имеет некоторые пользовательские свойства. Например, в нем есть свойство enum, называемое серьезностью. Установщик для этого свойства просматривает значение enum и устанавливает некоторые параметры, такие как цвет текста и границы, и тому подобное на базовой кнопке.

Это отлично работает…НО наши пользовательские элементы управления, которые размещают эту кнопку в своем конструкторе и задают значение серьезности в окне свойств, в конечном итоге фактически записывают код, который свойство серьезности выполняет в установщике, для самой кнопки пользовательского элемента управления.

Мы не хотим that…it сводит на нет цель создания общего свойства серьезности, потому что мы больше не можем изменять реализацию серьезности, и изменения не будут применяться глобально, потому что пользовательские элементы управления сами устанавливают свойство серьезности И код, который он содержал при перетаскивании в элемент управления…

Я пробовал добавлять атрибуты, такие как DesignerSerializationVisiblity и подобные, но, похоже, это никогда не дает желаемого эффекта.

Как мне запретить разработчику Windows Forms генерировать код ВНУТРИ реализации свойства серьезности?

Спасибо.

Ответ №1:

У меня была похожая проблема с WinForms, где форма запускала код в конструкторе. Чтобы обойти это, я создал статический метод, который проверял, является ли Visual Studio хост-процессом, и обернул его вокруг кода, который дизайнер должен игнорировать.

VB.Net

 Imports System.Diagnostics

Public Shared Function IsVisualStudioHostProcess() As Boolean
    Return (Process.GetCurrentProcess().ProcessName.ToUpper() = "DEVENV")
End Function

Public Sub MethodName()
    If Not (IsVisualStudioHostProcess()) Then
        ' Code here
    End If
End Sub
  

C#

 Using System.Diagnostics;

public static bool IsVisualStudioHostProcess()
{
    return (Process.GetCurrentProcess().ProcessName.ToUpper() == "DEVENV");
}

public void MethodName()
{
    if (!IsVisualStudioHostProcess())
    {
        // Code Here
    }
}
  

Комментарии:

1. Приятно! Я использую тот же метод в другом месте … но есть ли более чистый (т. Е. Более поддерживаемый) способ?

2. Кроме того, не помешает ли это отображению изменений в конструкторе?