我知道之前有人问过,但我相信我的情况有点不同 - 或者我不明白给出的答案。我已经花了大约4个小时来完成这个工作并最终意识到,我只是不知道该怎么做。
我有2个表单(Form1,Settings)和我创建的名为Themes的类。
我已获取/设置当前有效的属性,但都在Form1中,我想移动尽可能多的与主题相关的代码,因为我可以在Form1的外部进入Themes.cs
。
更改主题:要更改主题,用户打开“设置”表单并从下拉菜单中选择一个主题并按下“设置”按钮 - 这一切都有效,但现在我想把它移到我自己的班级我无法获得编译代码。
以下是移动前工作的示例代码 - 请注意,这只是我想修改的2个不同的控件,但总共大约有30个。我正在扫描代码:
表格1:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnSettings_Click(object sender, EventArgs e)
{
Settings frm = new Settings(this);
frm.Show();
}
private Color txtRSSURLBGProperty;
private Color txtRSSURLFGProperty;
public Color TxtRSSURLBGProperty
{
get { return txtRSSURLBGProperty; }
set { txtRSSURL.BackColor = value; }
}
public Color TxtRSSURLFGProperty
{
get { return txtRSSURLFGProperty; }
set { txtRSSURL.ForeColor = value; }
}
设置表单:
public partial class Settings : Form
{
public Settings()
{
InitializeComponent();
}
private Form1 rssReaderMain = null;
public Settings(Form requestingForm)
{
rssReaderMain = requestingForm as Form1;
InitializeComponent();
}
private void button2_Click(object sender, EventArgs args)
{
// Appearence settings for DEFAULT THEME
if (cbThemeSelect.SelectedIndex == 1)
{
this.rssReaderMain.TxtRSSURLBGProperty = Color.DarkSeaGreen;
this.rssReaderMain.TxtRSSURLFGProperty = Color.White;
[......about 25 more of these....]
}
主题类目前是空的。同样,目标是将尽可能多的代码移动到themes类中(特别是get / set语句,如果可能的话!),并希望在选择了适当的drowndown项后,只需在Settings表单中使用类似于此的方法:{{ 1}}
我希望有人可以提供帮助,我希望我解释得对!我一直在绞尽脑汁,我需要很快完成这项工作!非常感谢,因为我相信每个人都说。如果有人想要远程访问,我有团队浏览器或logmein - 这很简单。
如果需要,我也可以将我的项目作为zip发送。
非常感谢,
库尔特
修改后的审核代码:
Form1表格:
SetTheme(Default);
ThemeableForm表单:
public partial class Form1 : ThemeableForm
{
public Form1()
{
InitializeComponent();
}
设置表单:
internal abstract class ThemeableForm : Form
{
private Color rssLabelBGProperty;
private Color rssLabelFGProperty;
public Color RssLabelBGProperty
{
get { return rssLabelBGProperty; }
set { lRSS.BackColor = value; }
}
public Color RssLabelFGProperty
{
get { return rssLabelFGProperty; }
set { lRSS.ForeColor = value; }
}
现在我的get / set中的所有控件(上面示例代码中的lRSS)都错误地显示 public Settings(ThemeableForm requestingForm)
{
rssReaderMain = requestingForm as ThemeableForm;
InitializeComponent();
}
private ThemeableForm rssReaderMain = null;
private void button2_Click(object sender, EventArgs args)
{
// Appearence settings for DEFAULT THEME
if (cbThemeSelect.SelectedIndex == 1)
{
this.rssReaderMain.LRSSBGProperty = Color.DarkSeaGreen;
this.rssReaderMain.LRSSFGProperty = Color.White;
}
。我也收到了警告:
警告1无法显示此文件的设计者,因为没有 其中的类可以设计。设计师视察了 以下课程中的课程:
Form1 ---基类“RSSReader_BKRF.ThemeableForm”不可能 加载。确保已引用程序集和所有项目 已建成。 0 0
答案 0 :(得分:0)
让Themes
类主要由主题发生变化时更改的数据组成:颜色,字体等
让“设置”表单选择一个主题并将其写为默认主题。如果这是WinForms,那么你可以只使用Themes类的静态CurrentTheme
属性来返回在“设置”表单上选择的主题。
让Form1和任何其他表单将其某些属性委托给当前主题:
private Color BackgroundColor
{
get {return Themes.CurrentTheme.BackgroundColor;}
}
private Color TextColor
{
get {return Themes.CurrentTheme.TextColor;}
}
然后,您可能希望将这些委托属性推送到基本表单类,以便由多个表单共享。
答案 1 :(得分:0)
好的,我看到你试图让“设置”表单操纵几个(很多?)其他表单的属性值。
一种解决方案是让所有其他形式都从同一个抽象类继承,让我们称之为ThemeableForm。现在,您可以将ThemeableForm定义为具有所有常用属性。
一个简短的例子:
internal abstract class ThemeableForm : Form {
private Color txtRSSURLBGProperty;
private Color txtRSSURLFGProperty;
public Color TxtRSSURLBGProperty
{
get { return txtRSSURLBGProperty; }
set { txtRSSURL.BackColor = value; }
}
public Color TxtRSSURLFGProperty
{
get { return txtRSSURLFGProperty; }
set { txtRSSURL.ForeColor = value; }
}
}
并声明Form1:
public class Form1 : ThemeableForm {
// custom stuff for Form1, no need to write the common properties
}
我将其声明为“内部”,因为您可能想要控制继承THemeableForm的人/方式。但是,你也可以公之于众。并且设置可以使用ThemeableForm:
public Settings(ThemeableForm requestingForm)
{
rssReaderMain = requestingForm as ThemeableForm;
InitializeComponent();
}
private ThemeableForm rssReaderMain = null;
private void button2_Click(object sender, EventArgs args) {
// Appearence settings for DEFAULT THEME
if (cbThemeSelect.SelectedIndex == 1)
{
this.rssReaderMain.TxtRSSURLBGProperty = Color.DarkSeaGreen;
this.rssReaderMain.TxtRSSURLFGProperty = Color.White;
[......about 25 more of these....]
}
}
因此,您无需为每种其他表单类型复制任何设置代码。