保持图像的形式
本文关键字:图像 | 更新日期: 2023-09-27 18:21:59
我做了两个表格。Form2有设置背景图像的按钮。我得到了这个:
this.BackgroundImage = new Bitmap(Properties.Resources._1334821694552, new Size(800, 500));
//_1334821694552 is name of the image
如何通过单击按钮更改所有表单中的背景,直到选择另一张图片为止?
如果我理解正确,您有一个表单form2
,其中包含更改表单form1
上背景图像的按钮。
我想知道为什么在form2
中使用this.BackgroundImage
来更改背景图像?这将改变form2
上的背景图像,而不是form1
上的背景。
实际上,您应该将对form1
的引用传递给form2
,然后使用form1.BackgroundImage = ...
。
这一切都有点模糊——我建议你编辑你的问题,实际添加一些关于form1
和form2
之间关系的信息
首先,您需要将form1
的一个实例传递给form2
。这可以在构造函数中完成,例如,假设form2
在form1
中打开。例如:
表单2中的代码
// 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 = ...;
}
表单1中的代码
// 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的答案。这将保存用于设置的背景图像。
好吧,看来你想全局更改应用程序中所有表单的背景图像。你必须采取另一种方式,而不是我上面描述的方式。
我要做的是创建一个描述当前背景图像的singleton类,并在图像更改时通过事件通知订阅者。像这样,例如:
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 = ...;
完成。
如果希望所有表单都有相同的背景,那么应该使用继承。创建一个维护背景信息的主窗体,然后从该主窗体派生所有其他窗体。这样,您就不必在每个派生形式中重复逻辑,并且所有形式都将共享相同的行为。
设置起来很简单:
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.
}
您可以将资源的名称保存在应用程序设置中,然后每当打开表单时,您都可以从那里加载图像。(请注意,您必须有一个名为"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) 在您更改背景图像后,立即循环浏览应用程序的打开表单,并在那里设置它们:
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));
}
}
所有这一切都取决于你计划拥有多少个打开的表单,以及你在多少个位置为用户提供了更改表单图像的能力。如果你要处理许多表单,那么其他人在该页面上发布的解决方案可能适合你。