Управление элементами формы из другого потока в Windows Mobile - PullRequest
1 голос
/ 14 июня 2010

Попытка получить поток для изменения элементов управления формы в Windows Mobile.

Выдает неподдерживаемое исключение.

Означает ли это, что это вообще невозможно сделать?

Еслинет, как мне об этом?Формы создаются в родительском / основном потоке, а затем создается поток, чтобы выполнить некоторую работу в фоновом режиме, но я хочу сделать это так, чтобы фоновый поток мог обновить форму, чтобы показать ее заполненную ...

Ответы [ 3 ]

6 голосов
/ 14 июня 2010

Вы не можете получить доступ к элементам графического интерфейса в потоке без графического интерфейса.Вам нужно будет определить, требуется ли вызов для потока 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);
    }
}

Затем вы можете установить свойство enabled (из моего первого примера), используя ClassName.SetEnabledState(this, true);.

4 голосов
/ 14 июня 2010

Необходимо использовать свойство Control.InvokeRequired, поскольку элементы пользовательского интерфейса должны быть доступны из основного потока.

В вашей фоновой ветке вы создаете событие.

public event EventHandler<MyEventArgs> MyApp_MyEvent;

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

В основной ветке пользовательского интерфейса вы подписываетесь на это событие:

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