Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Не могу разобраться с кодом!


Автор: vikaz 8.9.2010, 06:54
Всем привет! Перевожу код из приложения написанного на WindowsForms в WPF. Есть вот такая функция:
Код

        private void EnableControls(bool bEnable)
        {
            // Do not change the state control during application closing.
            if( m_bExit )
                return;
            if (this.InvokeRequired)
            {
                EnableControlsCallback d = new EnableControlsCallback(this.EnableControls);
                this.Invoke( d, new object[] { bEnable } );
            }
            else
            {
                btnEnroll.Enabled = bEnable;
                btnIdentify.Enabled = bEnable;
                btnVerify.Enabled = bEnable;
                btnStop.Enabled = !bEnable;
            }
        }


, где:
 EnableControlsCallback - делегат
 
Код

delegate void EnableControlsCallback(bool bEnable );


m_bExit - переменная
Код

private bool m_bExit;


btnEnroll, btnIdentify, btnVerify, btnStop - кнопки на форме.

Суть вопроса: не могу понять, как запустить this.InvokeRequired и все что связано с Invoke. Посмотрел по MSDN, там написано, что для этого нужно импортировать System.ComponentModel. Импортировал, не помогло....

Автор: mrbrooks 8.9.2010, 07:50
Цитата(vikaz @  8.9.2010,  07:54 Найти цитируемый пост)
Суть вопроса: не могу понять, как запустить this.InvokeRequired и все что связано с Invoke.

в смысле запустить?
сдается мне в отдельном потоке. само по себе все вышеперечисленное ничего не делает.

Автор: vikaz 8.9.2010, 07:56
Цитата(mrbrooks @  8.9.2010,  09:50 Найти цитируемый пост)
в смысле запустить?
сдается мне в отдельном потоке. само по себе все вышеперечисленное ничего не делает. 

 smile в смысле повторить подобный код. Если он только для WindowsForms, то как это перевести для проекта WPF

Автор: CYBERDREAM 8.9.2010, 10:00
Привет vikaz, 
http://social.msdn.microsoft.com/forums/en-US/wpf/thread/360540eb-d756-4434-86f9-a3449f05eb55
как видится делается через Dispatcher object
тобишь тут будет нечто вроде
Код

private void EnableControls(bool bEnable)
{
    // Do not change the state control during application closing.
    if (m_bExit)
        return;
    if (this.Dispatcher.CheckAccess())
    {
        EnableControlsCallback d = new EnableControlsCallback(this.EnableControls);
        this.Dispatcher.Invoke(d, new object[] { bEnable });
    }
    else
    {
                   .....
    }
}

Автор: vikaz 8.9.2010, 10:36
Спасибо огромное! Попробую....

Автор: vikaz 9.9.2010, 11:58
Не хочет работать нормально, вот такая ошибка возникает:
http://pikucha.ru/674706

вот сам код:
Код

 private void EnabledControls(bool bEnable)
        {
           
            if (m_bExit) return;
            if (this.Dispatcher.CheckAccess())
            {
                 EnableControlsCallback d = new EnableControlsCallback(this.EnabledControls);
                 this.Dispatcher.Invoke(d,new object [] {bEnable});
            }
            else 
            {
                btnEnroll.IsEnabled = bEnable;
                btnIdentify.IsEnabled = bEnable;
                btnVerify.IsEnabled = bEnable;
                btnStop.IsEnabled = !bEnable;
            }

        }

Автор: vikaz 9.9.2010, 12:16
В общем, надо включать голову! smile (это я себе)
код должен быть таким: 
Код

 if (!this.Dispatcher.CheckAccess())
            {
                 EnableControlsCallback d = new EnableControlsCallback(this.EnabledControls);
                 this.Dispatcher.Invoke(d, new object[] { bEnable });
            }

ну или еще проще:
Код

 if (!this.Dispatcher.CheckAccess()) this.Dispatcher.Invoke(new EnableControlsCallback(this.EnabledControls), new object[] { bEnable });


ЗЫ! Осталось преобразовать bitmap и пол дела сделано! smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)