我正在尝试将当前在Form1图片框中显示的图像更改为我在Form2中通过openFileDialog选择的新图像。
似乎无法使其发挥作用。非常感谢帮助,谢谢。
代码:(相关功能)
**Form1.cs**
public partial class Form1 : Form
{
//Initializing first form:
public Form1()
{
InitializeComponent();
}
public Form1(Image newImage)
{
InitializeComponent();
picBtn.Image = newImage;
}
//This function is activated if the picture button was clicked:
private void picBtn_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.ShowDialog();
}
}
**Form2.cs**
public partial class Form2 : Form
{
//Initializing second form:
public Form2()
{
InitializeComponent();
}
//This function is activated if the image upload button was clicked:
private void imageUploadBtn_Click(object sender, EventArgs e)
{
//New file dialog object:
OpenFileDialog dialog = new OpenFileDialog();
//Accept images for files only:
dialog.Filter= "Image files (*.jpg, *.jpeg, *.jpe, *.jfif, *.png) | *.jpg; *.jpeg; *.jpe; *.jfif; *.png";
dialog.ShowDialog();
Image newImage = Image.FromFile(dialog.FileName);
Form1 form1 = new Form1(newImage);
}
}
答案 0 :(得分:1)
这里的问题是你有Form1
的多个实例。想象一下Form1
是一个苹果,Form2
是一个橘子。您在屏幕上显示了苹果,picBtn_Click
告诉计算机现在还显示橙色。
此橙色({1}}告诉计算机创建包含所选图像的imageUploadBtn_Click
。但是,您并没有告诉现有的苹果显示它,而且您也没有要求在屏幕上显示您的第二个苹果。
为这个奇怪的比喻道歉,但我希望它有所帮助。您希望new Apple
了解现有的Form2
。您可以让Form1
构造函数在创建时Form2
采用Form1
来执行此操作:
在Form2
:
private readonly Form1 _apple;
//Initializing second form:
public Form2(Form1 apple)
{
InitializeComponent();
_apple = apple;
}
//This function is activated if the image upload button was clicked:
private void imageUploadBtn_Click(object sender, EventArgs e)
{
//New file dialog object:
OpenFileDialog dialog = new OpenFileDialog();
//Accept images for files only:
dialog.Filter= "Image files (*.jpg, *.jpeg, *.jpe, *.jfif, *.png) | *.jpg; *.jpeg; *.jpe; *.jfif; *.png";
dialog.ShowDialog();
Image newImage = Image.FromFile(dialog.FileName);
// now, instead of creating a second instance of Form1,
// pass the image to the existing instance.
_apple.UpdatePicture(newImage);
}
您需要在名为public
的{{1}}上创建Form1
方法,但我会留给您。在创建UpdatePicture
时,您还需要Form1
将自己传递给Form2
,这可以这样做:
Form2
请注意,虽然这样可行,但我们会尽量避免将耦合 UI元素放在一起。它会起作用,但有一些更复杂的机制,例如MVVM可能值得一看。
答案 1 :(得分:0)
嗯,你可以这样做......
将您的class ViewController: UIViewController {
var activityIndicator = UIActivityIndicatorView()
var refreshBarButton = UIBarButtonItem()
var activityBarButton = UIBarButtonItem()
override func viewDidLoad() {
super.viewDidLoad()
activityIndicator.sizeToFit()
activityIndicator.color = self.view.tintColor
activityBarButton = UIBarButtonItem.init(customView: activityIndicator)
refreshBarButton = UIBarButtonItem(barButtonSystemItem: .refresh, target: self, action: #selector(refreshBarButtonPressed))
showRefreshButton()
}
func performNetworkOperation(completion: @escaping(Bool)->()) {
//simulate network operation
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(3), execute: {
completion(true)
})
}
@objc func refreshBarButtonPressed() {
showActivityIndicator()
activityIndicator.startAnimating()
performNetworkOperation { (result) in
//completion
self.activityIndicator.stopAnimating()
self.showRefreshButton()
}
}
func showRefreshButton() {
self.navigationItem.setRightBarButton(refreshBarButton, animated: true)
}
func showActivityIndicator() {
self.navigationItem.setRightBarButton(activityBarButton, animated: true)
}
}
方法更改为这样。
在这里,我删除了您的Form1.cs
方法并添加了一个名为Form1(Image newImage)
的新公共方法。
public void ChangePicImg(Image newImage)
另外,像这样更改public Form1()
{
InitializeComponent();
}
public void ChangePicImg(Image newImage)
{
picBtn.Image = newImage;
}
private void picBtn_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.ShowDialog();
}
。
Form2
public Form2()
{
InitializeComponent();
}
private void imageUploadBtn_Click(object sender, EventArgs e)
{
OpenFileDialog dialog = new OpenFileDialog();
dialog.Filter = "Image files (*.jpg, *.jpeg, *.jpe, *.jfif, *.png) | *.jpg; *.jpeg; *.jpe; *.jfif; *.png";
dialog.ShowDialog();
Image newImage = Image.FromFile(dialog.FileName);
Form1 frm1 = (Form1)System.Windows.Forms.Application.OpenForms["Form1"]; //Enter the Form1 name here
frm1.ChangePicImg(newImage);
}
=将Form1替换为Form1名称。