Обновление текстового блока на Windows Phone во время нажатия - PullRequest
0 голосов
/ 03 февраля 2012

Я разрабатываю приложение базы данных для Windows Phone 7.5 (манго).Я пытаюсь (во время нажатия на кнопку) обновить текстовый блок текстом «Поиск ...». Эта кнопка выполняет довольно длительный поиск в большой таблице и, таким образом, я хочу информировать пользователя.Однако все, что я пытаюсь, провалилось!Вот один из фрагментов кода, который я использовал.Есть ли способ добиться этого?Любая помощь, помогающая мне понять, что не так, будет оценена.

private void btnSearch_Tap(object sender, GestureEventArgs e)
{
    workerThread = new Thread(new ThreadStart(turnVisibilityOn));
    workerThread.Start();
    while (!workerThread.IsAlive) ;
    Thread.Sleep(500);

    //Search database takes about 15 sec on windows phone device!
    Procedures[] results = CSDatabase.RunQuery<Procedures>(@"select Code, Description from tblLibraries where Description like '%" +
    textBox1.Text + "%' or Code like '%" + textBox1.Text + "%'");

    this.MyListBox.ItemsSource = results;

    // Of course this not work
    Search1.Text = ""

}

private void turnVisibilityOn()
{
    // Inform the user updating the Search1 textblock
    // UIThread is a static class -Dispatcher.BeginInvoke(action)-
    UIThread.Invoke(() => Search1.Text = "Searching...");

}


public static class UIThread
{
   private static readonly Dispatcher Dispatcher;

       static UIThread()
       {
       // Store a reference to the current Dispatcher once per application
       Dispatcher = Deployment.Current.Dispatcher;
       }

       /// <summary>
       ///   Invokes the given action on the UI thread - if the current thread is the UI thread this will just invoke the action directly on
       ///   the current thread so it can be safely called without the calling method being aware of which thread it is on.
      /// </summary>
     public static void Invoke(Action action)
     {
         if (Dispatcher.CheckAccess())
         action.Invoke();
         else
         Dispatcher.BeginInvoke(action);
     }
}

1 Ответ

0 голосов
/ 13 февраля 2012

Я не уверен, что правильно понял проблему.Текст "Поиск ..." не отображается?Линия

// Of course this not work
Search1.Text = ""

не работает?(Почему вы пишете «Конечно, это не работает»? Почему бы это не сработало?)

Я не понимаю, почему вы меняете текст на «Поиск ...» в фоновом потоке.Вы можете сделать это в потоке пользовательского интерфейса и сделать трудоемкой работу в фоновом потоке, что-то вроде этого (я переключился на использование ThreadPool):

private void btnSearch_Tap( object sender, GestureEventArgs e )
{
    Search1.Text = "Searching..."

    ThreadPool.QueueUserWorkItem(p =>
    {
        Procedures[] results = CSDatabase.RunQuery<Procedures>( @"select Code, Description from tblLibraries where Description like '%" +
        textBox1.Text + "%' or Code like '%" + textBox1.Text + "%'" );

        // Dispatch manipulation of UI elements:
        Dispatcher.BeginInvoke( () =>
        {
            this.MyListBox.ItemsSource = results;
            Search1.Text = "";
        } );
    } ) ;
}

Вы всегда должны манипулировать элементами интерфейсаиз потока пользовательского интерфейса (в котором выполняется обработчик событий), и вы должны выполнять трудоемкую работу в фоновом потоке.

...