2015-11-05 77 views
0

我有两种形式a & b。表单a是主窗体,其按钮单击事件表单b之一显示为一个小窗口。在弹出窗体(表单b)上,我可以选择图像。我需要做的是当我点击保存按钮的弹出窗体(窗体b)时,窗体(主窗体)的背景图像应该设置为通过弹出窗体(b)选择的图像。Winforms c#更改背景从弹出窗体的父窗体的图像

我试过下面的代码,但this.Parent,this.Owner都弹出窗体(b)返回null。我已经指定了格式为MDI。

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

回答

1

我会做的是有一个公共图像属性,像这样的内部表格B:

private Image image; 
public Image SelectedImage 
{ 
    get 
    { 
     return image; 
    } 
} 

然后,我想补充一个button_Click事件(或任何你使用确认选择)。此事件将关闭窗体并设置返回图像。

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; 
} 
+0

不坏,但OP没有具体说明表单B是作为模式对话框打开的,而且该按钮应该关闭表单。即使是这种情况,最好的做法是在执行一些发布操作之前检查ShowDialog结果。 –

+1

我知道,我只是觉得我会留下模棱两可的空间,因为这个人没有在他们的具体代码和使用上留下太多细节。 – Rariolu

0

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

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;} 
} 

如果你宁愿有弹出开放作为一个普通窗口,可以同时使用父,你需要使用的事件,更多信息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; } 
} 
+0

与我的可疑类似,嗯。 – Rariolu

+0

哈哈,是的,它是明显的方式来做它假设窗体是一种模式:)没有足够快 – frich

+0

感谢@Rariolu&弗里奇,这没有把戏。我只能标记一个作为回答,因此标记了第一个:) – Shayam