2013-10-03 2 views
1

У меня этот код в VB.Net, в окнах. Мне нужно подождать выбора пользователя, но при этом пользовательский интерфейс реагирует, поэтому пользователь может выбрать опцию из списка. Событие listbox_SelectionChanged будет устанавливать логическое имя selectedElement в true, поэтому выполнение продолжается. В WPF я обнаружил, что это возможно сделать с помощью потоковой передачи, но я не уверен, как это сделать. Любой совет? Спасибо :)WPF Сохраняйте пользовательский интерфейс в ожидании выбора пользователя

Do 
     System.Windows.Forms.Application.DoEvents() 
    Loop Until selectedElement 
+0

Что вы ждете от этого, блокируя пользовательский интерфейс? что блокирует пользовательский интерфейс –

+1

'DoEvents()' is evil. даже в winforms. Отправьте соответствующий код, который продолжает выполнять и блокирует поток пользовательского интерфейса. –

ответ

1

Это ужасно плохой способ кодирования. Даже в winforms.

Прежде всего, если вы работаете в WPF, вам действительно нужно понять The WPF Mentality.

в MVVM WPF, ваш ViewModel должен контролировать действия, выполняемые приложением при реагировании на ввод пользователя.

Вообще говоря, это то, как вы имеете дело с «ждать пользователя, чтобы выбрать элемент в ListBox в WPF:

XAML:

<ListBox ItemsSource="{Binding SomeCollection}" 
     SelectedItem="{Binding SelectedItem}"/> 

ViewModel:

public class SomeViewModel 
{ 
    public ObservableCollection<SomeData> SomeCollection {get;set;} 

    //Methods to instantiate and populate the Collection. 

    private SomeData _selectedItem; 
    public SomeData SelectedItem 
    { 
     get { return _selectedItem; } 
     set 
     { 
      _selectedItem = value; 
      //PropertyChanged() is probably desired here. 

      UserHasSelectedAnItem(); //Method invocation 
     } 
    } 

    private void UserHasSelectedAnItem() 
    { 
     //Actions after the user has selected an item 
    } 
} 

Обратите внимание, что это принципиально отличается от подхода петли RefreshTheUIHack();.

Нет необходимости «зацикливать» что-либо, потому что WPF (а также winforms) уже имеет внутренний «цикл сообщений», который прослушивает ввод пользователя и при необходимости создает события.

Предлагаю вам прочитать приведенный выше связанный ответ и связанные с ним сообщения в блоге, чтобы понять, что вам нужно, чтобы перейти от традиционного процедурного подхода winforms к менталитету WPF на основе DataBinding.

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