Question

J'utilise PRISM dans une application SilverLight 4. J'ai un problème où les vues enregistrées dans certaines régions ne sont pas affichées.

Lors du chargement d'un module au démarrage, j'enregistrer des vues sur les régions comme suit:

RegionManager.RegisterViewWithRegion("MyRegion1", typeof(IMySubView1));
RegionManager.RegisterViewWithRegion("MyRegion2", typeof(IMySubView2));

J'ai vue la mise en œuvre d'une interface appelée IMyView, où les deux ont XAML contentcontrols avec des régions définies dans une grille comme ceci:

<ContentControl Regions:RegionManager.RegionName="MyRegion1" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" Grid.Row="0" Grid.RowSpan="1"/>
<ContentControl Regions:RegionManager.RegionName="MyRegion2" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" Grid.Row="1" Grid.RowSpan="1"/>

J'ai essayé deux méthodes différentes pour ajouter la vue de la région principale. Les deux ajoute la vue et les éléments de base tels que les boutons s'affichent, mais les régions définies dans la vue ne soit pas rempli de vues associées.

Méthode 1:

object obj = _container.Resolve<IMyView>();
IRegion mainRegion = _regionManager.Regions["MainViewRegion"];
IRegionManager scoped = mainRegion.Add(obj, "test", true);
mainRegion.Activate(obj);

// Enabling the following call, it will fail saying the region MyRegion1 does not exist. Feels like it should?
// IRegion myRegion = scoped.Regions["MyRegion1"];

Méthode 2:

object obj = _container.Resolve<IMyView>();
_regionManager.AddToRegion("MainViewRegion", obj);
_regionManager.Regions["MainViewRegion"].Activate(obj);

Il se sent comme les régions définies dans le fichier XAML ne s'enregistré pas, et à cause de ce que les vues enregistrées ne sont pas affichées.

Le MainViewRegion est définie dans l'enveloppe dans un TabControl comme suit:

<TabControl Margin="8,0,8,8" Regions:RegionManager.RegionName="MainViewRegion">

Toutes les suggestions sur la résolution de mon problème sera grandement appréciée!

Était-ce utile?

La solution 4

Le problème est allé dans la version 4.0 Prism, je courais Prism version 2.2 lorsque le problème est survenu.

Autres conseils

Je suis face au même problème. L'idée est que, pour une injection de vue {raison mainRegion.Add (obj, « test », true)} pour les régions déjà créées ne montre pas la vue. Une solution qui a fonctionné pour moi, est de créer la région à partir du code, puis injecter la vue. Quelque chose comme ceci:

Microsoft.Practices.Composite.Presentation.Regions.RegionManager.SetRegionManager (headerRegionContainer, _RegionManager);                             Microsoft.Practices.Composite.Presentation.Regions.RegionManager.SetRegionName (headerRegionContainer, regionName);

vue var = _UnityContainer.Resolve (bag.HeaderViewType); _RegionManager.Regions [regionName] .Add (vue); _RegionManager.Regions [regionName] .Activate (vue);

Malheureusement pour moi, je ne peux pas atteindre mon objectif de cette façon, mais peut-être que vous pouvez.

Cordialement,

Levente

Après plusieurs heures de dépannage que je trouve quelque chose.

Dans Composite.Presentation \ Régions \ RegionManager.cs il y a une méthode appelée IsInDesignMode. Quand une région est sur le point d'être créé cette méthode est appelée, et si cette méthode renvoie true la région n'est pas créée. Voir ci-dessous:

private static void OnSetRegionNameCallback(DependencyObject element, DependencyPropertyChangedEventArgs args)
{
    if (!IsInDesignMode(element))
    {
        CreateRegion(element);
    }
}

private static bool IsInDesignMode(DependencyObject element)
{
    // Due to a known issue in Cider, GetIsInDesignMode attached property value is not enough to know if it's in design mode.
    return DesignerProperties.GetIsInDesignMode(element) || Application.Current == null
           || Application.Current.GetType() == typeof(Application);
}

Lorsque notre application silverlight démarre et les régions dans la coquille est créé tout va bien, la propriété Application.Current est de type « MyName.Shell.App ». Mais lorsqu'une vue est ajouté après le démarrage, en réponse à l'entrée utilisateur, le type de Application.Current est soudainement de type « application », et donc la méthode IsInDesignMode renvoie true et les régions ne sont pas créées.

Si je supprime les conditions de Application.Current tout fonctionne comme prévu. La question est, est-il quelque chose de mal dans ma demande ou est-il quelque chose de mal dans le code source de prisme?

où est votre _regionManager vient? Avez-vous écrit un bon BootStrapper ? Vous devez écrire une classe héritant de MefBootstrapper ou UnityBootstrapper (ou par une autre si vous ne l'utilisez aucune de ces cadre IoC / Extension) afin d'enregistrer tous vos types nécessaires dans le conteneur IoC.

vous pouvez afficher le code BootStrapper?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top