控制.在CF 3.5中调用委托

本文关键字:调用 CF 控制 | 更新日期: 2023-09-27 18:13:28

似乎每个人都注意到CF无法控制。调用EventHandler类型以外的委托。我找到了一些方法来解决这个问题,并通过棘手的事件和属性捕获参数,但它只适用于某些对象/原语。

问题是当我尝试发送控件时,程序在执行时抛出一个异常:"Control. "调用必须用于与在单独线程上创建的控件进行交互,无论我是否选中了Control。isinvokerrequired并由处理程序通过Invoke方法跟踪…见鬼,有个代码片段:

    static class Program
{
    [MTAThread]
    static void Main()
    {
        Form1 frm = new Form1();
        frm.modifier = new CModifier(ref frm);
        Application.Run(frm);
    }
 }
class CModifier
{
    internal event EventHandler Modify;
    internal CModifier(ref Form1 _frm)
    { frm = _frm; }
    private Form1 frm;
    internal void Start()
    {
        Thread t = new Thread(new ThreadStart(TestMe));
        t.Start();
    }
    private void TestMe()
    {
        frm._current = new Label() { Text = "Try Me" };
        Modify(this, EventArgs.Empty);
    }
}
public partial class Form1 : Form
{
    internal Form1()
    {
        InitializeComponent();
    }
    internal CModifier modifier;
    internal Control _current;
    private void Form1_Load(object sender, EventArgs e)
    {
        modifier.Modify += new EventHandler(modifier_Modify);
        modifier.Start();
    }
    void modifier_Modify(object sender, EventArgs e)
    {
        if (this.InvokeRequired)
        {
            this.Invoke(new EventHandler(modifier_Modify));
        }
        this.panel1.Controls.Add(_current);
    }
}

我尝试了几乎每一种可能的方法,但我总是得到相同的结果。

我做错了什么?---->调用后会丢失一个"return;"

无论如何,实际的错误在我的应用程序(上面只是一个例子)是在这个过程中:

        internal void ManageControls(RSSDecisionMaking.InterfaceBehaviour _behaviour, Control _control)
    {
        if (this.InvokeRequired)
        {
            this.Invoke((Action)delegate { ManageControls(_behaviour, _control); });
            return;
        }
        switch (_behaviour)
        {
            case RSSDecisionMaking.InterfaceBehaviour.Display:
                this.pnDisplayContainer.Controls.Clear();
                this.pnDisplayContainer.Controls.Add(_control);
                break;
            case RSSDecisionMaking.InterfaceBehaviour.Command:
                this.pnDisplayContainer.Controls.Clear();
                this.pnDisplayContainer.Controls.Add(_control);
                this.pnDisplayContainer.Controls[0].Focus();
                break;
        }
    }

主要的区别是在调用的东西,我从另一个线程发送控件。

能告诉我这有什么区别吗?为什么这不起作用呢?

控制.在CF 3.5中调用委托

问题很简单。您的modifier_Modify调用调用调用正确,但然后它不退出,它继续向下,并在if块之后的线程上下文中调用Controls.Add(事实上,如果异常没有发生,Controls.Add将被调用两次)。在this.Invoke调用之后,在if块中插入一个return