C#从没有“公共”的外部类访问控件

时间:2010-12-07 02:28:16

标签: c#

我知道之前有人问过,但我相信我的情况有点不同 - 或者我不明白给出的答案。我已经花了大约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

2 个答案:

答案 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....]
    }
}

因此,您无需为每种其他表单类型复制任何设置代码。