2016-03-27 2 views
0

У меня проблема с моим пользовательским событием, не обновляющим текстовое поле в моем приложении UWP. Если я заменил Textbox1.Text на debug.Writeline, он будет работать. Есть ли причина, по которой я не могу обновить текстовое поле с помощью события? Если я использую объект Progress, он работает. Я просто пытаюсь понять, почему он не будет работать с моим собственным пользовательским событием. СпасибоC# Пользовательское событие В классе, не обновляющемся Текстовое поле

public sealed partial class MainPage : Page 
{ 
    public MainPage() 
    { 
     this.InitializeComponent(); 
    } 

    private void button_click(object sender, RoutedEventArgs e) 
    { 
     recData myRecDataobject = new recData(); 
     myRecDataobject.dataRecvEvent +=() => 
     { 
      textBox2.Text = "Event Occured"; // This throws an error 
      Debug.WriteLine("test2"); 
     }; 

     Progress<int> progress = new Progress<int>(); 
     myRecDataobject.getDataMethodAsync(progress); 
     progress.ProgressChanged += (o, result) => 
     { 
      textBox1.Text = result.ToString(); 

     }; 

    } 

} 

public class recData 
{ 
    public delegate void myEvenetHandlerDelegate(); 
    public event myEvenetHandlerDelegate dataRecvEvent; 


    private int _myValue; 
    public int myValue 
    { 
     get 
     { 
      return _myValue; 
     } 
     set 
     { 
      _myValue = value; 
     } 
    } 

    public async void getDataMethodAsync(Progress<int> progress) 
    { 
     await getDataMethod(progress); 
    } 

    private Task getDataMethod(IProgress<int> progress) 
    { 
     return Task.Factory.StartNew(() => 
     { 
      for (int i = 0; i < 1000; i++) 
      { 
       Task.Delay(2000).Wait(); 
       if (dataRecvEvent != null) 
       { 
        dataRecvEvent(); 
        progress.Report(i); 
       } 

      } 

     }); 
    } 


} 
+0

Какая ошибка, которую он выбрасывает? – m1o2

ответ

1

Вы пытаетесь обновить свойство XAML из фонового потока. Это не работает (ваша ошибка должна быть «запрещена»).

Используйте Dispatcher.BeginInvoke, чтобы запланировать обновление свойств TextBox в потоке пользовательского интерфейса.

+0

Спасибо, извините, только что вернулся. – user3363744

+0

Зачем прогресс, но не событие? – user3363744

+0

Поскольку это [задокументировано] (https://msdn.microsoft.com/en-us/library/hh193692 (v = vs.110) .aspx), чтобы поднять события в захваченном SynchronizationContext. –

Смежные вопросы