Однако теперь я обнаружил проблему, которую Подозреваемый — это ошибка в конструкторе 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
Мобильная версия