Winforms c# 从弹出窗体更改父窗体的背景图像

Winforms c# Changing background Image of Parent form from popup form

我有两种形式 a 和 b。表单 a 是主表单,在其按钮单击事件之一上,表单 b 显示为一个小 window。在弹出窗口(表格 b)中,我可以选择 select 图片。我需要做的是当我点击弹出窗口(表单 b)的保存按钮时,表单 a(主表单的)背景图像应该设置为图像 selected via popup form (b).

我尝试了以下代码,但 this.Parent、this.Owner 弹出表单 (b) 都返回空值。我已将表格 a 指定为 MDI。

this.Owner.BackgroundImage = pictureBoxBackground.Image;
this.Parent.BackgroundImage = pictureBoxBackground.Image;

我会做的是在表格 b:

中有一个像这样的 public 图像 属性
private Image image;
public Image SelectedImage
{
    get
    {
        return image;
    }
}

然后我会添加一个 button_Click 事件(或任何您用来确认选择的事件)。此事件将关闭表单并设置 return 图像。

private void Button_Click(object sender, EventArgs e)
{
    image = [Whatever Image variable that you want to return];
    Close();
}

让 FormB 看起来像这样。

public class FormB : Form
{
    //[...]Stuff
    private Image image;
    public Image SelectedImage
    {
        get
        {
            return image;
        }
    }
    private void Button_Click(object sender, EventArgs e)
    {
        image = [Whatever Image variable that you want to return];
        Close();
    }
}

最后,将其用于 FormA 的背景图像。简单的有以下程序。

public void ChangeBackground()
{
    FormB b = new FormB();
    b.ShowDialog();
    this.BackgroundImage = b.SelectedImage;
}

如果您希望弹出窗口作为对话框弹出,并且 return 图像,您可以将图像放在 属性 中。示例:

public class Parent : Form
{
     var popup = new Popup();
     var result = popup.ShowDialog();
     if(result == DialogResult.OK)
     {
        this.BackgroundImage = popup.Image;
     }
}

public class Popup : Form
{
    private void SelectImage()
    {
        Image = pictureBoxBackground.Image;
    }

    public string Image {get;set;}
}

如果您希望弹出窗口作为常规打开 window 并且能够同时使用父窗口,则需要使用事件,更多信息 here

public class Parent : Form
{
     var popup = new Popup();
     popup.BackgroundImageChanged += (sender, args) => this.BackgroundImage = args.Image;
     //...
}

public class Popup : Form
{
    public event EventHandler<ImageChangedEventArgs> BackgroundImageChanged;

    private void SelectImage()
    {
        // ...
        OnBackgroundImageChanged(pictureBoxBackground.Image);
    }

    private void OnBackgroundImageChanged(string image)
    {
        if(BackgroundImageChanged != null)
        {
            var e = new ImageChangedEventArgs(image);
            BackgroundImageChanged(this, e);
        }
    }
}

public class ImageChangedEventArgs : EventArgs
{
    public ImageChangedEventArgs(string image)   
    {
        Image = image;
    }
    public string Image { get; private set; }
}