использование диспетчера для загрузки пользовательских контролов в WPF - PullRequest
0 голосов
/ 23 марта 2011

У меня есть пользовательский элемент управления, в котором есть сетка с примерно 2900 элементами, я ничего не могу с этим поделать, так как бизнес этого хочет ... Очевидно, что это медленно загружается / отображается, поэтому я создалэтот прием с использованием диспетчера в модели представления, которая обрабатывает событие (событие призмы ... не стандартное событие Windows).

 public void ShowPopUp(Type viewType)
{
  var waitScreen = new Controls.Views.SampleView();
  var popUp = new ShellBlank();
  popUp.Content = waitScreen;
  popUp.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen;
  popUp.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Background, new Action(delegate() { 
    popUp.Content = container.Resolve(viewType);})
  );
  popUp.ShowDialog();
}

Он работает просто отлично, однако в моем SampleView (как он называется в данный момент) есть индикатор прогресса, который не определяется, однако он никогда не обновляется, как вы знаете, - зеленое бара и обратно четвертое... Вот XAML для этого.

 <Border>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Label Margin="12" FontSize="16" Foreground="WhiteSmoke" Content="Loading... Please wait"/>
        <ProgressBar Grid.Row="1" IsIndeterminate="True"  Width="280" Height="24"/>
    </Grid>
</Border>

Это как-то связано с тем, что диспетчер не позволяет обновляться?

Кто-нибудь когда-нибудь делал что-то подобное?есть какие-нибудь предложения?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 марта 2011

На самом деле, я закончил тем, что вызывал container.resolve для представления, я вызвал вызванный container.resolve для модели представления, это можно было сделать с помощью стандартного фонового работника - затем в банке RunWorkerCompleted with случай в основном потоке I создайте представление, передаваемое в модели представления, которую мы с удовольствием ждали в фоновом режиме, и отключите экран ожидания, который, конечно, не был затронут нашим длительным процессом. Вот код

 AddVendorModalityViewModel viewModel;
    var waitScreen = new Controls.Views.SampleView();
    var popUp = new ShellBlank();
    popUp.Content = waitScreen;
    popUp.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen;

    var bw = new BackgroundWorker() { WorkerReportsProgress = true, WorkerSupportsCancellation = true };
    bw.DoWork += (s, e) =>
    {
      viewModel = container.Resolve<AddVendorModalityViewModel>();
      e.Result = viewModel;
    };
    bw.RunWorkerCompleted += (s, e) =>
    {
      viewModel = (AddVendorModalityViewModel)e.Result;
      AddVendorModalityView view = new AddVendorModalityView(viewModel);
      popUp.Content = view;
    };
    bw.RunWorkerAsync();
    popUp.ShowDialog();

Надеюсь, это кому-нибудь пригодится ... Общая идея - создать ViewModel в другом потоке, потому что на его загрузку уйдет целая вечность и т. Д ...

0 голосов
/ 24 марта 2011

Я предполагаю, что поток Dispatcher занят, пытаясь отобразить ваш элемент управления, и не смог обновить ProgressBar.

Является ли всплывающее окно отзывчивым? Попробуйте переместить окно или добавить кнопку и посмотреть, сможете ли вы нажать на кнопку. Это может помочь определить, является ли это простой проблемой, когда индикатор выполнения или Диспетчер слишком занят.

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