Создание пользовательского элемента управления в диспетчере и добавление его в элемент управления в пользовательском интерфейсе - PullRequest
0 голосов
/ 25 сентября 2011

У меня есть длительная операция обработки , и для этого она должна быть выполнена в backGround, но проблема в следующем:

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

Я использовал backgroundWorker, затем я использовал Dispatcher из listView, затем основной Dispatcher, , но все с той же проблемой

Интересно, могу ли я использовать для этого UIThread, но яне знаю как.

Мой код:

        private void btn_click(object sender, System.Windows.RoutedEventArgs e)
    {

            string path = fileSourcesCombo.SelectedItem.ToString();

            converter = getConverter(path);

            this.Dispatcher.BeginInvoke(new Action(delegate()
            {
                System.Data.DataTable dataTable = converter.getDataTable();
                dataGrid.Dispatcher.Invoke(new Action(delegate()
                {
                    dataGrid.ItemsSource = dataTable.DefaultView;
                }
                ));

                List<MyAttribute> attributes = converter.attributes;

                foreach (MyAttribute attribute in attributes)
                {
                    string name = attribute.name;
                    string type = attribute.type;

                    CustomAttribute customAtt = new CustomAttribute(name, type);
                    ListViewControl.Dispatcher. Invoke(new Action(delegate() { ListViewControl.Items.Add(customAtt); }));
                }
            }
            ),System.Windows.Threading.DispatcherPriority.Background);

        }
  • Converter.getDataTable () занимает много времени.
  • dataGrid.Dispatcer.Invoke работает правильно, потому чтоэто обновляет и захватывающий контроль.
  • ListViewControl.Dispatcher, кажется, не работает должным образом, ни this.Dispatcher

, как я уже говорил, не генерируется ошибка компиляции, простовид списка, кажется, заполнен пустымэлементы на всех методах, которые я пробовал.

РЕДАКТИРОВАТЬ:

, когда я изменил ListView в ListItem, он работал, но я не знаю, почему ??как бы мне ни хотелось использовать вместо этого элемент управления listView ..

Это код Xaml, в котором он работает:

<Grid Margin="8,0">
<ListView x:Name="testpanel" Margin="8" BorderThickness="0" DisplayMemberPath="" Style="{DynamicResource SimpleListBox}" ItemContainerStyle="{DynamicResource SimpleListBoxItem}">                                         
</ListView>
</Grid>

, если я удалю DynemicResource из: ItemContainerStyle,это не работает

Ответы [ 2 ]

0 голосов
/ 25 сентября 2011

Невозможно точно сказать, в чем виноват, но вот несколько вещей, которые могут или не могут помочь:

  1. Если вы не используете ListView.View, вы должны просто использовать ListBox.
  2. Если вы добавляете элементы UI в элемент управления, вы не должны использовать DisplayMemberPath.
  3. Все, что внутри BeginInvoke, уже должно быть в потоке пользовательского интерфейса, так чтодополнительные диспетчерские вызовы внутри должны быть избыточными.(Прочитайте справочник по потокам )
  4. Если в фоновом потоке вызывается converter = getConverter(path), то часть, в которой вы создаете поток, либо отсутствует в вашем коде, либо происходят странные вещи, т.е.вызов обработчика события в коде.
  5. Элемент управления в вашем XAML называется testpanel, но в коде, который вы называете ListViewControl.Items.Add, я надеюсь, что это просто некоторая несогласованность в вашем посте кода.
  6. ItemContainerStyle может содержать все виды вещей, которые могут испортить вещи.
0 голосов
/ 25 сентября 2011

Пожалуйста, опубликуйте XAML для вашего ListView. Возможно, вам не хватает DisplayMemberPath? Вот как он будет себя вести, если у него есть Предметы, но он не знает, что отображать.

...