2

我有一个用户控件,它包含一个面板,该面板包含一个图片框。当我将鼠标移动到图片框上时,我想更新 MainForm 上的标签。我在主窗体上有一个 get/set 方法,但我该如何使用它?谢谢

  public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }
        public String MouseCords
        {
            get { return this.MouseCordsDisplayLabel.Text; }
            set { this.MouseCordsDisplayLabel.Text = value; }
        }
    }


    public partial class ScoreUserControl : UserControl
    {
        public ScoreUserControl()
        {
            InitializeComponent();
        }

        private void ScorePictureBox_MouseMove(object sender, MouseEventArgs e)
        {
            // MainForm.MouseCords("Hello"); //What goes here?
        }
    }
4

5 回答 5

2

实际上,在您的情况下可以这样做:

((MainForm)this.ParentForm).MouseCords = "Some Value Here";

但正确的方法是像 Felice Pollano 提到的事件:

public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();

        this.myCustomControlInstanse.PicureBoxMouseMove += new EventHandler<StringEventArgs>(myCustomControlInstanse_PicureBoxMouseMove);
    }

    private void myCustomControlInstanse_PicureBoxMouseMove(object sender, StringEventArgs e)
    {
        this.MouseCordsDisplayLabel = e.Value // here is your value
    }
}


public class StringEventArgs : EventArgs
{
    public string Value { get; set; }
}

public partial class ScoreUserControl : UserControl
{
    public event EventHandler<StringEventArgs> PicureBoxMouseMove;

    public void OnPicureBoxMouseMove(String value)
    {
        if (this.PicureBoxMouseMove != null)
            this.PicureBoxMouseMove(this, new StringEventArgs { Value = value });
    }

    public ScoreUserControl()
    {
        InitializeComponent();
    }

    private void ScorePictureBox_MouseMove(object sender, MouseEventArgs e)
    {
        this.OnPicureBoxMouseMove("Some Text Here");
    }
}
于 2012-04-18T09:30:35.647 回答
2

理想情况下,您应该为此发起一个事件。

创建委托

public delegate void  Update();

在用户控件中

public class MyUserControl : UserControl
{
public event Update OnUpdate;

}

在主窗体上为用户控件事件注册一个处理程序。

public class Main
{
public Main()
{
myUserControl.OnUpdate += new Update(this.UpdateHandler);
}

void UpdateHandler()
{
//you can set the delegate with sm arguments
//set a property here

}
}

在用户控制上,

在按钮单击时引发事件

做这个

OnUpdate();
于 2012-04-18T09:35:09.513 回答
1

这可能会给你一个想法...

    public partial class ScoreUserControl : UserControl
{
    public ScoreUserControl()
    {
        InitializeComponent();
    }

    private void ScorePictureBox_MouseMove(object sender, MouseEventArgs e)
    {
        // MainForm.MouseCords("Hello"); //What goes here?
        MainForm parent = this.ParentForm as MainForm;
        if (parent != null) parent.MouseCordsDisplayLabel.Text = "Hello";
    }
}
于 2012-04-18T09:32:11.433 回答
1

你有几个选择:

  1. 在用户控件上创建一个事件并且必须形成监听它(我认为这是大多数 C# 程序员推荐的方式)。
  2. 将对主窗体的引用传递给用户控件(在构造函数中)。这样,用户控件就知道它的 MainForm。
  3. 投射this.ParentForm到 MainForm 类,然后你就有了参考。

选项 2 和 3 更舒适和懒惰,但代价是用户控件必须知道特定的 MainForm 类。第一个选项的优点是您可以在另一个项目中重用用户控件,因为它不知道 MainForm 类。

于 2012-04-18T09:34:52.257 回答
0

您应该从用户控件发布一个事件并从主窗体订阅它。至少这是为 winform 建议的模式。无论如何,这个想法是让需要查看坐标的代理“可观察”控件,而不是使用它作为驱动程序来更新感兴趣的代理。

于 2012-04-18T09:27:03.090 回答