Prism - View Navigation работает только один раз, при инициализации - PullRequest
0 голосов
/ 29 октября 2019

Я новичок в использовании платформы Prism.

Я установил свое приложение, и все работало нормально. Однако теперь я пытаюсь разделить две области, которые у меня есть, с помощью модуля.

Теперь, когда я перехожу к любому виду во втором регионе, я больше не могу переходить к любому другому виду в этом регионе.

Вот код:

    public void OnInitialized(IContainerProvider containerProvider)
    {
        _regionManager = containerProvider.Resolve<IRegionManager>();

        _regionManager.RequestNavigate("ContentRegion", "ClientWindow");

        _factory.BuildString(
            "Model[System.Mode]",
            OnModeChanged);
    }

    public void RegisterTypes(IContainerRegistry containerRegistry)
    {
        containerRegistry.RegisterForNavigation<ClientWindow>();
        containerRegistry.RegisterForNavigation<AnyGame>();
        containerRegistry.RegisterForNavigation<LockupControl>();
        containerRegistry.RegisterForNavigation<MenuControl>();

        Configuration configuration = new Configuration("TargetApplication", Environment.GetCommandLineArgs());
        _model = new ModelManager();
        Listener listener = new Listener(
            configuration.ModelClient,
            connected => ClientConnectionChanged(connected));
        _factory = new BindingFactory(_model);

        containerRegistry.RegisterInstance(configuration);
        containerRegistry.RegisterInstance(_model);
        containerRegistry.RegisterInstance(listener);
        containerRegistry.RegisterInstance(_factory);
    }

    /// <summary>
    /// Handle a connection changed notification on the main UI thread.
    /// </summary>
    /// <param name="connected">True if connected.</param>
    private void ClientConnectionChanged(bool connected)
    {
        if (connected)
        {
            _model.Reset();
        }
        else
        {
            _model.ProcessDisconnected();
        }
    }

    private void OnModeChanged(string mode)
    {
        switch (mode)
        {
            default:
            case "Game":
                _regionManager.RequestNavigate("ClientRegion", "AnyGame");
                break;
            case "Lockup":
                _regionManager.RequestNavigate("ClientRegion", "LockupControl");
                break;
            case "Menu":
                _regionManager.RequestNavigate("ClientRegion", "MenuControl");
                break;
        }
    }

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

Любая помощь будет принята с благодарностью. :) Спасибо!

1 Ответ

0 голосов
/ 29 октября 2019

Я решил эту проблему.

Метод OnModeChanged пытается перейти к модели представления без надлежащего доступа к потоку.

private void OnModeChanged(string mode)
    {
        if (Application.Current.Dispatcher != null)
        {
            Application.Current.Dispatcher.BeginInvoke(
                DispatcherPriority.Background,
                new Action(
                    () =>
                    {
                        switch (mode)
                        {
                            default:
                            case "Game":
                                _regionManager.RequestNavigate("GameRegion", "AnyGame");
                                break;
                            case "Lockup":
                                _regionManager.RequestNavigate("GameRegion", "LockupControl");
                                break;
                            case "Menu":
                                _regionManager.RequestNavigate("GameRegion", "MenuControl");
                                break;
                        }
                    }));
        }
    }

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

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