我做了2个表格。Form2 具有设置背景图像的按钮。我懂了 :
this.BackgroundImage = new Bitmap(Properties.Resources._1334821694552, new Size(800, 500));
//_1334821694552 is name of the image
如何通过单击按钮更改所有形式的背景,该按钮将保持这种状态,直到选择另一张图片?
我做了2个表格。Form2 具有设置背景图像的按钮。我懂了 :
this.BackgroundImage = new Bitmap(Properties.Resources._1334821694552, new Size(800, 500));
//_1334821694552 is name of the image
如何通过单击按钮更改所有形式的背景,该按钮将保持这种状态,直到选择另一张图片?
如果我理解正确,您有一个表单form2,其中包含用于更改表单背景图像的按钮form1。
我想知道您为什么使用this.BackgroundImageinform2来更改背景图像?这将更改背景图像 on form2,而不是 on form1。
您实际上应该传递对 to 的引用form1,form2然后使用form1.BackgroundImage = ....
这有点含糊 - 我建议您编辑您的问题以实际添加一些关于form1和之间关系的信息form2。
首先,您需要传递一个 to 的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 = ...;
完毕。
您可以将资源的名称保存在应用程序设置中,然后每当打开表单时,您都可以从那里加载图像。(请注意,您必须有一个名称为“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 是否仍然相同,如果不是则更改它。
或者
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));
        }
} 
所有这一切都取决于您计划拥有多少个打开的表单,以及您在多少个位置为用户提供更改表单图像的能力。如果您正在处理许多表单,那么其他人在此页面上发布的解决方案可能适合您。
如果您希望所有表单具有相同的背景,那么您应该使用继承。创建一个维护背景信息的主表单,然后从该主表单派生所有其他表单。这样,您不必在每个派生表单中重复逻辑,并且所有表单都将共享相同的行为。
设置非常简单:
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.
}