UserControl 无效的 .resx 文件无法加载类型 - 需要设计时支持
UserControl invalid .resx file could not load type - Design time support needed
我想做什么:
我正在创建一个自定义控件,它将按照 ListView(组和项目)的方式工作。
控件有组,组有项目,因此可以先创建一个组,然后向该组添加一个或多个项目(在该组属性下)。
问题:
当我尝试构建我的项目时,我 运行 遇到了这个错误:
Invalid Resx file.
Could not load type Widget.ListCategory, Widget, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null which is used in the .RESX file.
Ensure that the necessary references have been added to your project. Line 186, position 5. Widget C:\Users\mb.ITHOZTING\Dropbox\Widget\Widget\Form1.resx 186
尝试修复项目:
我尝试了很多不同的东西,所以你必须原谅我,我不能记住所有的,但这些是我记得的:
我已经尝试实现 ISerializer 接口,但对我的回忆并没有真正做任何事情。
我试过删除 .Resx 文件中生成的代码,然后重新配置控件。没有帮助。
- 我试过用不同的标签标记不同的属性和 类,例如 [Serializable]。
代码
这是错误消息的罪魁祸首:
[Serializable]
class ListCategory : ListItemBase
{
#region Properties
private List<ListItem> items = new List<ListItem>();
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[Editor(typeof(ListItemCollectionEditor), typeof(System.Drawing.Design.UITypeEditor))]
public List<ListItem> Items
{
get { return items; }
set { items = value; }
}
#endregion
}
现在有很多文件和大量代码,所以这是整个项目:https://www.dropbox.com/sh/zwz72dqm7vii78v/AACLjpy2DYZyQPxP_BBf0WTQa?dl=0
我应该采取什么步骤来解决这个问题?
我可能找到了解决方案,但我不是 100% 确定,因为我觉得它有点不稳定(不是解决方案,而是问题),所以我不会将其标记为答案.
不过,我必须做的是为每个给我带来问题的 class 添加一个 TypeConverter。
例如,第一个是 ListCategory,然后其他 classes 开始出现问题,然后我只需要遵循相同的过程直到它起作用。
我将两篇关于提供丰富的设计时支持的不同文章中的 TypeConverter 混合在一起。
这些是链接:
- http://www.codeproject.com/Articles/9667/Creating-Custom-Controls-Providing-Design-Time-Sup
- http://www.codeproject.com/Articles/5502/Creating-Collection-Based-Controls-with-Rich-Desig
这是生成的 TypeConverter:
class GroupListConverter : TypeConverter
{
public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes)
{
return TypeDescriptor.GetProperties(typeof(GroupList));
}
public override bool CanConvertTo(ITypeDescriptorContext context, Type destType)
{
if (destType == typeof(InstanceDescriptor))
return true;
return base.CanConvertTo(context, destType);
}
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destType)
{
if (destType == typeof(InstanceDescriptor))
{
System.Reflection.ConstructorInfo ci = typeof(GroupList).GetConstructor(System.Type.EmptyTypes);
return new InstanceDescriptor(ci, null, false);
}
return base.ConvertTo(context, culture, value, destType);
}
}
我想做什么:
我正在创建一个自定义控件,它将按照 ListView(组和项目)的方式工作。
控件有组,组有项目,因此可以先创建一个组,然后向该组添加一个或多个项目(在该组属性下)。
问题:
当我尝试构建我的项目时,我 运行 遇到了这个错误:
Invalid Resx file.
Could not load type Widget.ListCategory, Widget, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null which is used in the .RESX file.
Ensure that the necessary references have been added to your project. Line 186, position 5. Widget C:\Users\mb.ITHOZTING\Dropbox\Widget\Widget\Form1.resx 186
尝试修复项目:
我尝试了很多不同的东西,所以你必须原谅我,我不能记住所有的,但这些是我记得的:
我已经尝试实现 ISerializer 接口,但对我的回忆并没有真正做任何事情。
我试过删除 .Resx 文件中生成的代码,然后重新配置控件。没有帮助。
- 我试过用不同的标签标记不同的属性和 类,例如 [Serializable]。
代码
这是错误消息的罪魁祸首:
[Serializable]
class ListCategory : ListItemBase
{
#region Properties
private List<ListItem> items = new List<ListItem>();
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[Editor(typeof(ListItemCollectionEditor), typeof(System.Drawing.Design.UITypeEditor))]
public List<ListItem> Items
{
get { return items; }
set { items = value; }
}
#endregion
}
现在有很多文件和大量代码,所以这是整个项目:https://www.dropbox.com/sh/zwz72dqm7vii78v/AACLjpy2DYZyQPxP_BBf0WTQa?dl=0
我应该采取什么步骤来解决这个问题?
我可能找到了解决方案,但我不是 100% 确定,因为我觉得它有点不稳定(不是解决方案,而是问题),所以我不会将其标记为答案.
不过,我必须做的是为每个给我带来问题的 class 添加一个 TypeConverter。
例如,第一个是 ListCategory,然后其他 classes 开始出现问题,然后我只需要遵循相同的过程直到它起作用。
我将两篇关于提供丰富的设计时支持的不同文章中的 TypeConverter 混合在一起。
这些是链接:
- http://www.codeproject.com/Articles/9667/Creating-Custom-Controls-Providing-Design-Time-Sup
- http://www.codeproject.com/Articles/5502/Creating-Collection-Based-Controls-with-Rich-Desig
这是生成的 TypeConverter:
class GroupListConverter : TypeConverter
{
public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes)
{
return TypeDescriptor.GetProperties(typeof(GroupList));
}
public override bool CanConvertTo(ITypeDescriptorContext context, Type destType)
{
if (destType == typeof(InstanceDescriptor))
return true;
return base.CanConvertTo(context, destType);
}
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destType)
{
if (destType == typeof(InstanceDescriptor))
{
System.Reflection.ConstructorInfo ci = typeof(GroupList).GetConstructor(System.Type.EmptyTypes);
return new InstanceDescriptor(ci, null, false);
}
return base.ConvertTo(context, culture, value, destType);
}
}