保持图像形式

时间:2013-07-11 07:20:52

标签: c#

我做了两个表格。 Form2具有设置背景图像的按钮。我明白了:

this.BackgroundImage = new Bitmap(Properties.Resources._1334821694552, new Size(800, 500));
//_1334821694552 is name of the image

如何通过单击按钮更改所有表单中的背景,直到选择另一张图片为止?

3 个答案:

答案 0 :(得分:4)

如果我理解正确,您的表单form2包含用于更改表单form1上的背景图片的按钮。

我想知道你为什么在this.BackgroundImage中使用form2更改背景图片?这会更改form2上的背景图片,而不会更改form1上的背景图片。

您实际上应该将对form1的引用传递给form2,然后使用form1.BackgroundImage = ...

这有点模糊 - 我建议你编辑你的问题,以实际添加一些关于form1form2之间关系的信息。


首先,您需要将form1的实例传递给form2。这可以在构造函数中完成,例如,假设在form2中打开了form1。例如:

form2中的代码

// In form2, there's a member variable that holds the form1 reference
private form1 m_form1Instance;

// The constructor of form2 could look like this
public form2(form1 form1Instance)
{
    ...

    // Remember the form1-instance
    m_form1Instance = form1Instance;
}

// When a button is clicked in form2, the background image in form1 is changed
private void button1_Click(object sender, EventArgs e)
{
    m_form1Instance.BackgroundImage = ...;
}

form1中的代码

// When form2 is opened, pass "this" to the constructor. The following
// sample opens form2 as a modal dialog
using (form2 f2 = new form2(this))
{
    f2.ShowDialog(this);
}

这应该更改form1上的背景图片,而不是form2上的背景图片。

如果要保存,会话中显示哪个背景图像(即,您希望显示相同的背景图像,重新启动程序时),请使用Wink的答案。这会保存用于设置的背景图像。


好的,所以您似乎想全局更改应用程序中所有表单上的背景图像。你必须采取与我上面描述的方式不同的方式。

我要做的是创建一个描述当前背景图像的单例类,并具有在图像更改时通知订阅者的事件。像这样,例如:

public class BackgroundImageHolder
{
    private static BackgroundImageHolder m_instance;
    private Bitmap m_backgroundImage;

    public event EventHandler BackgroundImageChanged;

    private BackgroundImageHolder() { }

    public static BackgroundImageHolder Instance
    {
        get
        {
            if (m_instance == null) m_instance = new BackgroundImageHolder();
            return m_instance;
        }
    }

    public Bitmap BackgroundImage
    {
        get { return m_backgroundImage; }
        set {
           m_backgroundImage = value;
           OnBackgroundImageChanged();
        }
    }

    protected void OnBackgroundImageChanged()
    {
        if (BackgroundImageChanged != null)
            BackgroundImageChanged(this, EventArgs.Empty);
    }
}

每当您打开表单时(即在构造函数中),您都会在BackgroundImageHolder查询当前图像并为表单设置它:

this.BackgroundImage = BackgroundImageHolder.Instance.BackgroundImage;

然后您订阅了通知,因此表单可以在必要时更改背景图像:

BackgroundImageHolder.Instance.BackgroundImageChanged += BackgroundImageHolder_Changed;

您需要实现事件处理程序:

private void BackgroundImageHolder_Changed(object sender, EventArgs e)
{
    this.BackgroundImage = BackgroundImageHolder.Instance.BackgroundImage;
}

然后,要全局更改图像,只需告诉BackgroundImageHolder新图像:

BackgroundImageHolder.Instance.BackgroundImage = ...;

完成。

答案 1 :(得分:0)

您可以在application settings中保存资源的名称,然后只要表单打开,您就可以从那里加载图像。 (请注意,您必须具有名称为“formBackgroundImage”的应用程序设置才能使其正常工作)。

这样的事情:

Settings.Default["formBackgroundImage"] = "_1334821694552";

并且在每个表格的Form1_Load中都应该写下相同的图片:

this.BackgroundImage = new Bitmap( Properties.Resources.ResourceManager.GetObject(Settings.Default["formBackgroundImage"]), new Size(800, 500));

如果您想要更改已打开的表单上的图片,您可以:

a)当表单的Activated事件触发时,检查backgroundImage是否仍然相同,如果不是则更改它。

OR

b)在更改backgroundImage之后,遍历应用程序的打开表单并将它们设置在那里:

private void changeBackgroundImage()
{
    //set the backgroundImage for this form
    this.BackgroundImage = new Bitmap(Properties.Resources._1334821694552, new Size(800, 500));

    //save the backgroundImage in an application settings
    Settings.Default["formBackgroundImage"] = "_1334821694552";

    //set the backgroundImage for all open forms in the application:
        foreach (Form f in Application.OpenForms) {
                f.BackgroundImage = new  Bitmap(Properties.Resources.ResourceManager.GetObject(Settings.Default["formBackgroundImage"]),new Size(800, 500));
        }

} 

所有这些取决于您计划使用的打开表单的数量以及您为用户提供更改表单图像的位置数量。如果您正在处理多种表格,那么其他人在此页面上发布的解决方案可能适合您。

答案 2 :(得分:0)

如果您希望所有表单具有相同的背景,则应使用inheritance。创建一个维护背景信息的主表单,然后从该主表派生所有其他表单。这样,您不必在每个派生表单中重复逻辑,并且所有表单都将共享相同的行为。

设置非常简单:

public class MasterBackgroundForm : Form
{
   public override Image BackgroundImage
   {
      get
      {
         return m_backgroundImage;
      }
      set
      {
         if (m_backgroundImage != value)
         {
            m_backgroundImage = value;
            this.OnBackgroundImageChanged(EventArgs.Empty);
         }
      }
   }

   protected override void OnLoad(EventArgs e)
   {
      base.OnLoad(e);

      // Set default background image.
      this.BackgroundImage = new Bitmap(Properties.Resources._1334821694552,
                                        new Size(800, 500));
   }

   private static Image m_backgroundImage;
}
public class Form1 : MasterBackgroundForm
{
    public Form1()
    {
        InitializeComponent();
    }

    // ... etc.
}
public class Form2 : MasterBackgroundForm
{
    public Form2()
    {
        InitializeComponent();
    }

    // ... etc.
}