怎么不让winform设计器自动修改属性?

twtyypmb123 2016-05-23 06:19:42
为了省事和方便,准备在工程中写一个基础窗体,规定大小,背景,字体等等一系列属性,其他窗体继承这一个基础窗体就行了,方便统一管理,现在的方法是直接去子类的设计中某行的代码删掉(例如,背景图属性),然后就可以继承基础窗体的属性了,但是有时候打开设计器这些属性又被自动修I改了,怎么把这些固定下来,不被自动修改,但也不是不能修改
...全文
764 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
twtyypmb123 2016-05-24
  • 打赏
  • 举报
回复
引用 9 楼 zhi_ai_yaya 的回复:
[quote=引用 7 楼 xiaoxin3357 的回复:] 最简单的就是写一个公共的窗体然后每个窗体继承那个公共窗体
引用 6 楼 x3230835 的回复:
就拿窗体大小为例,假设我的基类是CommonForm,已经设置了大小1024*768,我新创建一个窗体Form1,窗体大小就会被默认设置为300*300,然后我在From1中把它的父类改成CommonForm,然后再到Form1的design.cs把大小的那句话删除了,Form1的大小就变为了1024*768,但是当某个时候再打开Form1,就会自动在design.cs把设置大小的语句加上(可能是检测到没有设置大小的语句而设计器自动加的),然后就没有从CommonForm中继承大小
楼猪操作步骤不对。既然要继承窗口,就创建时直接继承,干嘛要先创建再继承。[/quote]打开方式不对么?楼上是按照创建“继承的窗体”来的,还是有楼上的问题
twtyypmb123 2016-05-24
  • 打赏
  • 举报
回复
引用 8 楼 daixf_csdn 的回复:
[quote=引用 6 楼 x3230835 的回复:]
[quote=引用 5 楼 daixf_csdn 的回复:]
[quote=引用 3 楼 x3230835 的回复:]



[quote=引用 2 楼 daixf_csdn 的回复:]
在基类Form中,把页面所有控件的修饰符改为protected。最方便的无遗漏的修改,就是直接修改Designer.cs

你可能没理解到我的意思,在设计器打开子类的时候,会在这里面自动生成一些属性赋值语句,但是这些属性应该是继承基础类的而不是重新赋值[/quote]
这应该和你的派生类中,UI的布局模式有关。我做过很复杂的UI继承,也没碰到过这种情况。
你或者可以把全部的Designer.cs贴上来看看[/quote]
就拿窗体大小为例,假设我的基类是CommonForm,已经设置了大小1024*768,我新创建一个窗体Form1,窗体大小就会被默认设置为300*300,然后我在From1中把它的父类改成CommonForm,然后再到Form1的design.cs把大小的那句话删除了,Form1的大小就变为了1024*768,但是当某个时候再打开Form1,就会自动在design.cs把设置大小的语句加上(可能是检测到没有设置大小的语句而设计器自动加的),然后就没有从CommonForm中继承大小[/quote]
我做了个简单测试,并没有发生你说的情况,我从派生窗体里删除的代码也很简单,就一句话:
this.ClientSize = new System.Drawing.Size(371, 232);
就能恢复成基类窗体的大小,而且反复打开派生窗体,都没发生窗体大小变化的情况。

所以我猜测你的情况是种特例,是和你UI设计的某些特殊性有关系,你不贴代码别人也分析不出来[/quote]
我的代码很简单,不是我不帖。。。。
---------------------
基类
private void InitializeComponent()
{
this.SuspendLayout();
//
// CommFrm
//
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
this.BackColor = System.Drawing.SystemColors.Control;
this.BackgroundImage = global::Cy.Medical.View.Properties.Resources.bg;
this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
this.ClientSize = new System.Drawing.Size(1280, 1024);
this.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.Name = "CommFrm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.CommFrm_FormClosing);
this.ResumeLayout(false);

}

--------
Form2,空的Form,只继承基类
public partial class Form2 : CommFrm
{
public Form2()
{
InitializeComponent();
}
}


然后可以看到红色标记里面基类有设置,但是没有继承过来,Form2的构造函数加或不加base()都一样
我叫小菜菜 2016-05-24
  • 打赏
  • 举报
回复
引用 7 楼 xiaoxin3357 的回复:
最简单的就是写一个公共的窗体然后每个窗体继承那个公共窗体
引用 6 楼 x3230835 的回复:
就拿窗体大小为例,假设我的基类是CommonForm,已经设置了大小1024*768,我新创建一个窗体Form1,窗体大小就会被默认设置为300*300,然后我在From1中把它的父类改成CommonForm,然后再到Form1的design.cs把大小的那句话删除了,Form1的大小就变为了1024*768,但是当某个时候再打开Form1,就会自动在design.cs把设置大小的语句加上(可能是检测到没有设置大小的语句而设计器自动加的),然后就没有从CommonForm中继承大小
楼猪操作步骤不对。既然要继承窗口,就创建时直接继承,干嘛要先创建再继承。
圣殿骑士18 2016-05-24
  • 打赏
  • 举报
回复
引用 6 楼 x3230835 的回复:
[quote=引用 5 楼 daixf_csdn 的回复:] [quote=引用 3 楼 x3230835 的回复:] [quote=引用 2 楼 daixf_csdn 的回复:] 在基类Form中,把页面所有控件的修饰符改为protected。最方便的无遗漏的修改,就是直接修改Designer.cs
你可能没理解到我的意思,在设计器打开子类的时候,会在这里面自动生成一些属性赋值语句,但是这些属性应该是继承基础类的而不是重新赋值[/quote] 这应该和你的派生类中,UI的布局模式有关。我做过很复杂的UI继承,也没碰到过这种情况。 你或者可以把全部的Designer.cs贴上来看看[/quote] 就拿窗体大小为例,假设我的基类是CommonForm,已经设置了大小1024*768,我新创建一个窗体Form1,窗体大小就会被默认设置为300*300,然后我在From1中把它的父类改成CommonForm,然后再到Form1的design.cs把大小的那句话删除了,Form1的大小就变为了1024*768,但是当某个时候再打开Form1,就会自动在design.cs把设置大小的语句加上(可能是检测到没有设置大小的语句而设计器自动加的),然后就没有从CommonForm中继承大小[/quote] 我做了个简单测试,并没有发生你说的情况,我从派生窗体里删除的代码也很简单,就一句话: this.ClientSize = new System.Drawing.Size(371, 232); 就能恢复成基类窗体的大小,而且反复打开派生窗体,都没发生窗体大小变化的情况。 所以我猜测你的情况是种特例,是和你UI设计的某些特殊性有关系,你不贴代码别人也分析不出来
万婷 2016-05-24
  • 打赏
  • 举报
回复
最简单的就是写一个公共的窗体然后每个窗体继承那个公共窗体
twtyypmb123 2016-05-24
  • 打赏
  • 举报
回复
引用 5 楼 daixf_csdn 的回复:
[quote=引用 3 楼 x3230835 的回复:] [quote=引用 2 楼 daixf_csdn 的回复:] 在基类Form中,把页面所有控件的修饰符改为protected。最方便的无遗漏的修改,就是直接修改Designer.cs
你可能没理解到我的意思,在设计器打开子类的时候,会在这里面自动生成一些属性赋值语句,但是这些属性应该是继承基础类的而不是重新赋值[/quote] 这应该和你的派生类中,UI的布局模式有关。我做过很复杂的UI继承,也没碰到过这种情况。 你或者可以把全部的Designer.cs贴上来看看[/quote] 就拿窗体大小为例,假设我的基类是CommonForm,已经设置了大小1024*768,我新创建一个窗体Form1,窗体大小就会被默认设置为300*300,然后我在From1中把它的父类改成CommonForm,然后再到Form1的design.cs把大小的那句话删除了,Form1的大小就变为了1024*768,但是当某个时候再打开Form1,就会自动在design.cs把设置大小的语句加上(可能是检测到没有设置大小的语句而设计器自动加的),然后就没有从CommonForm中继承大小
圣殿骑士18 2016-05-24
  • 打赏
  • 举报
回复
引用 3 楼 x3230835 的回复:
[quote=引用 2 楼 daixf_csdn 的回复:] 在基类Form中,把页面所有控件的修饰符改为protected。最方便的无遗漏的修改,就是直接修改Designer.cs
你可能没理解到我的意思,在设计器打开子类的时候,会在这里面自动生成一些属性赋值语句,但是这些属性应该是继承基础类的而不是重新赋值[/quote] 这应该和你的派生类中,UI的布局模式有关。我做过很复杂的UI继承,也没碰到过这种情况。 你或者可以把全部的Designer.cs贴上来看看
Dobzhansky 2016-05-24
  • 打赏
  • 举报
回复
设置默认值, 以及是否序列化
twtyypmb123 2016-05-24
  • 打赏
  • 举报
回复



引用 2 楼 daixf_csdn 的回复:
在基类Form中,把页面所有控件的修饰符改为protected。最方便的无遗漏的修改,就是直接修改Designer.cs

你可能没理解到我的意思,在设计器打开子类的时候,会在这里面自动生成一些属性赋值语句,但是这些属性应该是继承基础类的而不是重新赋值
Dobzhansky 2016-05-24
  • 打赏
  • 举报
回复
class BaseForm : System.Windows.Forms.Form
{
protected BaseForm()
{
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
}

public bool ShouldSerializeFormBorderStyle()
{
return this.FormBorderStyle != System.Windows.Forms.FormBorderStyle.None;
}
}

这样,子类不是 None 时,才生成代码。
圣殿骑士18 2016-05-24
  • 打赏
  • 举报
回复
引用 14 楼 x3230835 的回复:
[quote=引用 12 楼 daixf_csdn 的回复:] 楼主,我尝试了一下你说的,有点不一样。 虽然如你所说,我把基类的FormBorderStyle 改为: this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; 然后发现派生类窗体打开时,仍然是FixedSingle,但是: 1、FixedSingle并没有在派生类的代码中被指定,也就是说派生类代码并没有自己产生代码 2、如果此时,你重新编译整个项目,你会发现派生类的FormBorderStyle也变成了None,UI也变化了。 但是,如果你修改了基类的窗体属性后,没有立即编译整个项目,就对派生类进行了修改,比如添加了控件,这种问题就 通过vs自动生成的代码被固化下来了,也就是你所描述的问题。 也就是说,vs的问题是,vs在派生类UI元素的属性展示上,有点小问题。但这可以通过一些技巧避免的。为什么会产生 这种问题,也肯定是可以解释的,有可能不是bug,只是功能不完善,虽然我现在还没想到
还真是这样,辛苦了兄弟,感谢一起探讨,另外最后个问题,你的头像的番号多少?[/quote] 什么是番号?
twtyypmb123 2016-05-24
  • 打赏
  • 举报
回复
引用 12 楼 daixf_csdn 的回复:
楼主,我尝试了一下你说的,有点不一样。 虽然如你所说,我把基类的FormBorderStyle 改为: this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; 然后发现派生类窗体打开时,仍然是FixedSingle,但是: 1、FixedSingle并没有在派生类的代码中被指定,也就是说派生类代码并没有自己产生代码 2、如果此时,你重新编译整个项目,你会发现派生类的FormBorderStyle也变成了None,UI也变化了。 但是,如果你修改了基类的窗体属性后,没有立即编译整个项目,就对派生类进行了修改,比如添加了控件,这种问题就 通过vs自动生成的代码被固化下来了,也就是你所描述的问题。 也就是说,vs的问题是,vs在派生类UI元素的属性展示上,有点小问题。但这可以通过一些技巧避免的。为什么会产生 这种问题,也肯定是可以解释的,有可能不是bug,只是功能不完善,虽然我现在还没想到
还真是这样,辛苦了兄弟,感谢一起探讨,另外最后个问题,你的头像的番号多少?
风吹腚腚凉 2016-05-24
  • 打赏
  • 举报
回复
你是不是在构造函数里面对属性进行处理了? 如果是的话神仙也没招!
圣殿骑士18 2016-05-24
  • 打赏
  • 举报
回复
楼主,我尝试了一下你说的,有点不一样。 虽然如你所说,我把基类的FormBorderStyle 改为: this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; 然后发现派生类窗体打开时,仍然是FixedSingle,但是: 1、FixedSingle并没有在派生类的代码中被指定,也就是说派生类代码并没有自己产生代码 2、如果此时,你重新编译整个项目,你会发现派生类的FormBorderStyle也变成了None,UI也变化了。 但是,如果你修改了基类的窗体属性后,没有立即编译整个项目,就对派生类进行了修改,比如添加了控件,这种问题就 通过vs自动生成的代码被固化下来了,也就是你所描述的问题。 也就是说,vs的问题是,vs在派生类UI元素的属性展示上,有点小问题。但这可以通过一些技巧避免的。为什么会产生 这种问题,也肯定是可以解释的,有可能不是bug,只是功能不完善,虽然我现在还没想到
圣殿骑士18 2016-05-24
  • 打赏
  • 举报
回复
在基类Form中,把页面所有控件的修饰符改为protected。最方便的无遗漏的修改,就是直接修改Designer.cs
南天空 2016-05-23
  • 打赏
  • 举报
回复
额你的想法。。。不太符合winform的思想,winform可编辑性强,设计简单,要是按你的想法又想要可编辑,又想固定一些属性变,那你直接在窗体的构造函数中定义属性值好了。

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧