WPF вызывает элемент управления - PullRequest
11 голосов
/ 25 октября 2010

Как я могу вызвать элемент управления с параметрами?Я погуглил это, но нигде не найти!

invi thread of *

Это ошибка, которую я получаю:

Дополнительноинформация: Несоответствие количества параметров.

И это происходит, когда я делаю простую проверку, является ли свойство text элемента управления textbox пустым или нет.Это работает в WinForms:

if (this.textboxlink.Text == string.Empty)
   SleepThreadThatIsntNavigating(5000);

Он прыгает с этой строки, если строка в блок catch и показывает мне это сообщение.

Вот как я пытаюсь вызвать элемент управления:

// the delegate:
private delegate void TBXTextChanger(string text);

private void WriteToTextBox(string text)
{
    if (this.textboxlink.Dispatcher.CheckAccess())
    {
        this.textboxlink.Text = text;
    }
    else
    {
        this.textboxlink.Dispatcher.Invoke(
            System.Windows.Threading.DispatcherPriority.Normal,
            new TBXTextChanger(this.WriteToTextBox));
    }
}

Что я делаю не так?И с каких пор я должен вызывать элемент управления, когда просто хочу прочитать его содержимое?

Ответы [ 2 ]

20 голосов
/ 25 октября 2010

Когда вы вызываете Invoke, вы не указываете свой аргумент (text).Когда диспетчер пытается запустить ваш метод, у него нет параметра для предоставления, и вы получаете исключение.

Try:

this.textboxlink.Dispatcher.Invoke(
     System.Windows.Threading.DispatcherPriority.Normal,
     new TBXTextChanger(this.WriteToTextBox), text);

Если вы хотите прочитатьзначение из текстового поля, одним из вариантов является использование лямбда-выражения:

string textBoxValue = string.Empty;

this.textboxlink.Dispatcher.Invoke(DispatcherPriority.Normal, 
     new Action( () => { textBoxValue = this.textboxlink.Text; } ));

if (textBoxValue == string.Empty)
    Thread.Sleep(5000);
0 голосов
/ 25 октября 2010

Рид верен, но причина, по которой вам нужно это сделать, состоит в том, что элементы графического интерфейса не являются потокобезопасными, и поэтому все операции с графическим интерфейсом должны выполняться в потоке графического интерфейса, чтобы обеспечить правильное чтение содержимого. Менее очевидно, почему это необходимо для операции чтения, подобной этой, но очень важно для операций записи, и поэтому .NET Framework просто требует, чтобы весь доступ к GUI выполнялся в потоке GUI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...