Prism WPF: загрузка пользовательского элемента управления при запуске - PullRequest
0 голосов
/ 21 мая 2018

Я видел несколько примеров изменения пользовательского элемента управления только в одном окне с использованием Prism для WPF, и это выглядит так:

Bootstrapper.cs

    protected override void ConfigureContainer()
    {
        base.ConfigureContainer();

        Container.RegisterType(typeof(object), typeof(ViewA), "ViewA");
        Container.RegisterType(typeof(object), typeof(ViewB), "ViewB");
    }

MainWindowViewModel.cs

    public class MainWindowViewModel : BindableBase
    {
        private readonly IRegionManager _regionManager;

        public DelegateCommand<string> NavigateCommand;


        public MainWindowViewModel(IRegionManager regionManager)
        {
            _regionManager = regionManager;

            NavigateCommand = new DelegateCommand<string>(ExecuteNavigateCommand);
        }

        private void ExecuteNavigateCommand(string uri)
        {
            _regionManager.RequestNavigate("ContentRegion", uri);
        }
    }

MainWindow.xaml

<Button Grid.Row="1" Grid.Column="1" Command="{Binding NavigateCommand}" CommandParameter="ViewA" FontSize="16" Content="View A" Margin="4"/>
<Button Grid.Row="1" Grid.Column="2" Command="{Binding NavigateCommand}" CommandParameter="ViewB" FontSize="16" Content="View B" Margin="4"/>

Вы можете щелкнуть по нему, и вид изменится.Но когда вы его запускаете, пользовательский элемент управления не загружается, а только главное окно.У меня вопрос Как вы можете загрузить пользовательский элемент управления в MainWindow при запуске приложения?

1 Ответ

0 голосов
/ 21 мая 2018

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

_regionManager.RegisterViewWithRegion("MyRegion", typeof(ViewA));

В качестве альтернативы, вы можете перейти к представлению, когда приложение завершит запуск.То есть с конца Bootstrapper.InitializeModules.Если загрузчик не знает о представлении или вы хотите сделать что-то еще в данный момент, вы также можете опубликовать событие, например ModulesInitialized, и позволить модулю, определяющему ваше представление, подписаться на это событие.

// in the assembly defining the interfaces shared between your modules
public class ModulesInitialized : PubSubEvent {}

// in the bootstrapper.InitializeModules
Container.Resolve<IEventAggregator>().GetEvent<ModulesInitialized>().Publish();

// in the module defining viewA
_eventAggregator.GetEvent<ModulesInitialized>().Subscribe( () => _regionManager.Requestnavigate( "MyRegion", "ViewA" ), true );
...