在Windows Mobile中控制来自不同线程的表单元素

时间:2010-06-14 12:44:32

标签: c# forms windows-mobile

尝试在Windows Mobile中获取更改表单控件的线程。

引发不受支持的例外。

这是否意味着它根本无法完成?

如果没有,我该如何解决这个问题?在父/主线程中创建表单,然后创建一个线程在后台执行一些工作,但我想这样做,以便后台线程可以更新表单以显示其完成...

3 个答案:

答案 0 :(得分:6)

您无法访问非GUI线程上的GUI项。您需要确定GUI线程是否需要调用。例如(这是我之前提到的一些):

public delegate void SetEnabledStateCallBack(Control control, bool enabled);
public static void SetEnabledState(Control control, bool enabled)
{
    if (control.InvokeRequired)
    {
        SetEnabledStateCallBack d = new SetEnabledStateCallBack(SetEnabledState);
        control.Invoke(d, new object[] { control, enabled });
    }
    else
    {
        control.Enabled = enabled;
    }
}

或者

public delegate void AddListViewItemCallBack(ListView control, ListViewItem item);
public static void AddListViewItem(ListView control, ListViewItem item)
{
    if (control.InvokeRequired)
    {
        AddListViewItemCallBack d = new AddListViewItemCallBack(AddListViewItem);
        control.Invoke(d, new object[] { control, item });
    }
    else
    {
        control.Items.Add(item);
    }
}

然后,您可以使用ClassName.SetEnabledState(this, true);设置启用的属性(来自我的第一个示例)。

答案 1 :(得分:4)

您需要使用Control.InvokeRequired属性,因为必须从主线程访问UI元素。

在你的后台主题中你举起一个活动。

public event EventHandler<MyEventArgs> MyApp_MyEvent;

this.MyApp_MyEvent(this, new MyEventArgs(MyArg));

在您的主UI线程中,您订阅了该事件:

this.myThread.MyApp_MyEvent+= this.MyAppEventHandler;

和处理程序本身:

private void MyApp_EventHandler(object sender, MyEventArgs e)
{
    if (this.MyControl.InvokeRequired)
    {
        this.MyControl.Invoke((MethodInvoker)delegate { this.MyAction(e.MyArg); });
    }
    else
    {
        this.MyAction(e.MyArg);
    }
}

答案 2 :(得分:0)