继承的控件不在表单设计器生成的代码中生成代码
Posted
技术标签:
【中文标题】继承的控件不在表单设计器生成的代码中生成代码【英文标题】:Inherited control not generate code in form designer generated code 【发布时间】:2013-03-30 18:22:08 【问题描述】:我正在尝试继承 DevExpress PictureEdit(但是,我认为这个问题不是 DevExpress 特有的)。我给它添加了一些属性。
public class RepositoryItemFotoEdit:RepositoryItemPictureEdit
private Size _imageSize;
public Size ImageSize
get
return _imageSize;
set
_imageSize = value;
OnPropertiesChanged();
[DefaultValue(InterpolationMode.HighQualityBicubic)]
public new InterpolationMode PictureInterpolationMode
get return base.PictureInterpolationMode;
set base.PictureInterpolationMode = value;
[DefaultValue(PictureSizeMode.Zoom)]
public new PictureSizeMode SizeMode
get return base.SizeMode;
set base.SizeMode = value;
public RepositoryItemFotoEdit()
PictureInterpolationMode = InterpolationMode.HighQualityBicubic;
SizeMode = PictureSizeMode.Zoom;
public sealed class FotoEdit : PictureEdit
private FotoMenu _menu;
protected override void Dispose(bool disposing)
if (disposing)
if (_menu != null)
_menu.Dispose();
base.Dispose(disposing);
public override Image Image
get
return base.Image;
set
if(Properties.ImageSize.Width == 0 || Properties.ImageSize.Height == 0 || value == null)
base.Image = value;
else
var heightProp = (double) Properties.ImageSize.Height/value.Height;
var widthProp = (double) Properties.ImageSize.Width/value.Width;
var prop = heightProp < widthProp ? heightProp : widthProp;
base.Image = ImageHelper.ResizeImage(value, (int)(prop*value.Width), (int)(prop*value.Height));
public new RepositoryItemFotoEdit Properties
get return base.Properties as RepositoryItemFotoEdit;
protected override PictureMenu Menu
get return _menu ?? (_menu = new FotoMenu(this));
protected override EditorClassInfo EditorClassInfo
get
var beci = base.EditorClassInfo;
var eci = new EditorClassInfo("FotoEdit", typeof (FotoEdit), typeof (RepositoryItemFotoEdit),
beci.ViewInfoType, beci.Painter, beci.DesignTimeVisible);
return eci;
属性 ImageSize
出现在 PropertyEditor 上。
.
但是,如果我将其更改为某个值(例如 150;150),则它不会在表单设计器生成的代码中生成代码。
请注意,ImageSize
在 Properties
属性内。
//
// fotoEdit1
//
this.fotoEdit1.Cursor = System.Windows.Forms.Cursors.Default;
this.fotoEdit1.Location = new System.Drawing.Point(583, 370);
this.fotoEdit1.Name = "fotoEdit1";
this.fotoEdit1.Size = new System.Drawing.Size(150, 150);
this.fotoEdit1.TabIndex = 18;
这将导致ImageSize
值恢复为 0;0。如何解决这个问题?
编辑:
我尝试按照某人的建议将[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
添加到Properties
属性(我忘记了他的名字,他删除了他的答案)。这导致Properties
属性内的属性出现在设计器生成的代码中,除了那些被覆盖的。
我的设计器生成的代码如下所示:
//
// fotoEdit1
//
this.fotoEdit1.Cursor = System.Windows.Forms.Cursors.Default;
this.fotoEdit1.Location = new System.Drawing.Point(583, 370);
this.fotoEdit1.Name = "fotoEdit1";
this.fotoEdit1.Properties.Padding = new System.Windows.Forms.Padding(5, 2, 0, 0);
this.fotoEdit1.Size = new System.Drawing.Size(150, 150);
this.fotoEdit1.TabIndex = 18;
注意Properties.Padding
出现了,但Properties.ImageSize
没有出现。
【问题讨论】:
后面的代码是你所期望的,还是你得到的?看起来不错。 @GrantThomasthis.fotoEdit1.Properties.ImageSize= new System.Drawing.Size(150, 150);
应该出现在设计器生成的代码中
【参考方案1】:
我只是通过将[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
添加到Properties
属性并将[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
添加到Properties.ImageSize
属性来解决问题。
【讨论】:
以上是关于继承的控件不在表单设计器生成的代码中生成代码的主要内容,如果未能解决你的问题,请参考以下文章
如何停止 Visual Studio 为设计器中的控件生成属性设置?