.NET 8 в Winforms удаляет код в Designer.cs, как этого избежать?C#

Место общения программистов C#
Ответить
Anonymous
 .NET 8 в Winforms удаляет код в Designer.cs, как этого избежать?

Сообщение Anonymous »

У нас есть проект Winforms, обновленный до .NET 8. При преобразовании было лишь несколько проблем, которые можно было легко исправить, поэтому мы продолжили идти по этому пути.

Однако теперь я обнаружил проблему, которую Подозреваемый — это ошибка в конструкторе Winforms в .NET 8.
У меня есть пользовательский элемент управления, и панель этого элемента управления помечена как «зона перетаскивания», поэтому вы можете переместить элементы управления в этот пользовательский элемент управления. управление в дизайнере. Это работало хорошо до перехода на .NET 8.
Вот фрагмент кода пользовательского элемента управления:
[Designer(typeof(UserControlDesigner))]
[Serializable]
public partial class gttDXGridDashboard : UserControl
{
// define a property called "DropZone"
[Category("Appearance")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public PanelControl DropZone
{
get { return panelControlCustom; }
}

// ...
}

public class UserControlDesigner : ParentControlDesigner
{
public override void Initialize(IComponent component)
{
base.Initialize(component);

if (Control is gttDXGridDashboard dashboard)
{
bool result = EnableDesignMode(dashboard.DropZone, "DropZone");
// this writeline never shows, maybe because it's in a control from the toolbox ?
Console.WriteLine($"EnableDesignMode(dashboard.DropZone, \"DropZone\") = {result}");
}
}
}

PanelControl от Devexpress, это контейнерный элемент управления, основанный на Panel
Теперь о проблеме: в форма, на которой есть gttDXGridDashboard и кнопка в зоне сброса, Designer.cs выглядит следующим образом:
// gttDXGridDashboardList.DropZone
//
this.gttDXGridDashboardList.DropZone.Controls.Add(this.gttDXSimpleButtonAddMultipleChassis);

Это работало хорошо, пока проект работал на платформе .NET, но с момента перехода на .NET 8 эта строка в файле Designer.cs с этого момента удалена Я помещаю другой элемент управления в зону сброса или даже когда я, например, перемещаю существующую кнопку (gttDXSimpleButtonAddMultipleChassis) немного вправо или влево.
В этот момент кнопка gttDXSimpleButtonAddMultipleChassis все еще существует в форме, но больше не имеет родительского элемента и поэтому невидима и непригодно для использования.
Я пробовал обновить все пакеты, пересобрать все исходные коды, перезапустить VS, но безрезультатно.
Тогда я захотел найти обходной путь и напишите некоторый код, который поместит все элементы управления без родительского элемента обратно в зону сброса, но я не знаю, как искать элементы управления, у которых нет родительского элемента, я не могу перебрать это.Controls, потому что у этих элементов управления нет родительского элемента больше.
Здесь мне нужна небольшая помощь.
  • Я сделал что-то не так с определением зоны сброса?< /li>
    Известна ли эта ошибка/проблема, и если да, то есть ли ее исправление/обходной путь?
  • Если все не удалось, как мне найти элементы управления, у которых нет родитель?
Я знаю, что всегда могу написать код в формах, в которых возникает проблема с возвращением элементов управления, но это будет означать написание почти того же кода опять же в нескольких формах, мне нужен более общий обходной путь.
РЕДАКТИРОВАТЬ

Я поместил специальную кнопку в зону сброса, чтобы я мог переопределить событие изменения родительского элемента, например это
protected override void OnParentChanged(EventArgs e)
{
base.OnParentChanged(e);

string newParent = "null";
if (this.Parent != null)
{
newParent = this.Parent.Name;
}

Console.WriteLine($"gttDXSimpleButtonAddMultipleChassis parent has changed to {newParent}");
}

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

Таким образом, либо у нее все еще есть родительский элемент, либо удаление этой строки еще не привело к тому, что родительский элемент стал нулевым.
Это очень сложная задача.
РЕДАКТИРОВАТЬ 2

Я поместил новый пользовательский элемент управления в тестовую форму и сбросил 2 кнопки на "dropzone", оказывается, что Designer.cs теперь хочет сделать это по-другому в .net8, результат в Designer.cs был таким
gttdxGridDashboard1.Controls.Add(button3);
gttdxGridDashboard1.Controls.Add(button2);

Итак, теперь я убежден, что в .net8 ParentControlDesigner больше не работает, из-за чего EnableDesignMode никогда не произойдет.

Еще одним намеком на это является то, что переопределение onDragOver в ParentControlDesigner, похоже, больше не работает, в рамках dotnet оно не позволяет программистам удалять элементы управления из других частей, кроме зоны сброса, но теперь оно просто больше ничего не делает, похоже вот так
// prevents dropping of controls onto non-Design-mode enabled areas
protected override void OnDragOver(DragEventArgs de)
{
de.Effect = DragDropEffects.None;
}


Подробнее здесь: https://stackoverflow.com/questions/784 ... avoid-this
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»