【发布时间】:2019-10-28 15:15:26
【问题描述】:
我在使用 UserControls 的 VS2019 中遇到了一些问题。
我有一个基本用户控件 (WinForms),我希望从中继承所有其他用户控件。基本控件提供了许多我需要的常用属性。
public partial class MyBaseControl : System.Windows.Forms.UserControl
{
internal Int32 _caseID;
internal object _objectID;
public int CaseID { get => _caseID; set => _caseID = value; }
public object ObjectID { get => _objectID; set => _objectID = value; }
internal virtual void MakeScreenReadOnly()
{
}
public MyBaseControl()
{
Type systemType = this.GetType();
PropertyInfo propertyInfo = systemType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);
this.AutoScroll = true;
}
}
当应用程序运行时,继承此基本控件的控件都可以正常工作,但我无法在设计器中查看该控件。用户控件是
public partial class AddressControl : MyBaseControl
{
....
}
我得到了错误
The service System.Windows.Forms.Design.IEventHandlerService already exists in the service container. Parameter name: serviceType
尝试在设计器中查看 AddressControl 时。
这曾经在早期版本的 Visual Studio 中有效。有没有人有任何想法?
【问题讨论】:
-
我发现了一些有趣的东西。该解决方案由 3 个项目组成,一个数据访问库 (.Net Framework)、UI(包含详细控件的 WinForms 项目)和一个支持库 (.NET Core)。如果我删除支持库并引用已编译的 DLL,它似乎一切都很好。如果我引用该项目,那就是我获得项目的时候。 UI 项目同时引用数据访问和支持库,支持库引用数据访问库
-
用户控件构造函数是否应该包含 InitializeComponent();?
-
我已经添加了,但没有解决问题
-
之后您是否进行了干净的重建?
-
移除那个反射的东西。在 UserControl 中,您可以在其构造函数中设置
this.DoubleBuffered = true;或this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);。 -- 确保在基类和派生类中没有重复的属性,例如[Designer(GetType(...)]。在这种情况下,从派生类中删除属性。 -- 不要在基类中做任何与设计时间/设计模式相关的事情(检查if (DesignMode) (...)),尤其是在Load事件中。如果需要设置某些内容,请覆盖OnHandleCreated()或OnLayout()或两者。
标签: c# winforms inheritance user-controls