#.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. Кроме того, не помешает ли это отображению изменений в конструкторе?