2009-12-09 3 views
1

La documentation du prisme indique qu'il ya trois adaptateurs disponibles: régionComment utiliser un panneau comme région dans Prism?

ContentControlRegionAdapter. Cet adaptateur adapte les contrôles de type System.Windows.Controls.ContentControl et les classes dérivées.

SelectorRegionAdapter. Cet adaptateur adapte les contrôles dérivés de la classe System.Windows.Controls.Primitives.Selector, tels que le contrôle System.Windows.Controls.TabControl.

ItemsControlRegionAdapter. Cet adaptateur adapte les contrôles de type System.Windows.Controls.ItemsControl et les classes dérivées.

Malheureusement, Panel ne tombe pas dans l'une de ces catégories, et je veux être en mesure d'écrire dans mon .xaml.cs:

<Canvas cal:RegionManager.RegionName="{x:Static local:RegionNames.MainCanvas}"> 

Comment pouvons-nous y arriver?

+0

Le problème ici est que la toile n'impose aucune mise en page. Vous allez rencontrer des problèmes à moins que vous ne rendiez votre regionadapter un peu plus intelligent quant au placement des éléments qui sont enregistrés dans cette région (c'est aussi la raison pour laquelle Panel n'est pas supporté). Je suis curieux ... quelle application avez-vous pour cela? –

+0

Je suis en train de mettre à jour une base de code existante qui a des conteneurs de contrôle flottants (comme des barres d'outils) qui devraient être à l'intérieur d'un canevas. Ils gèrent leur propre "barre de titre" région et mettent à jour leur position de toile sur glisser. Évidemment, cela pourrait être accompli d'autres façons, mais, comme toujours, le temps est essentiel et cela semble être le moyen le plus rapide de convertir la structure existante pour travailler avec Prism. – Jedidja

+0

Avoir une mise à jour de contrôle sa position semble un peu illogique ... sorte de "sortir de votre boîte". +1 pour pouvoir convertir la base de code existante. –

Répondre

2

La réponse à cela peut être trouvée dans ce très agréable, descriptive blog post.

Cependant, je veux aussi la réponse stockée sur StackOverflow :) Il a fallu un peu de recherche pour l'obtenir de Google. Voici mon code qui fonctionne avec un panneau de base.

Étape 1 - créer une nouvelle région adaptateur

public class PanelHostRegionAdapter : RegionAdapterBase<Panel> 
{ 
    public PanelHostRegionAdapter(IRegionBehaviorFactory behaviorFactory) 
     : base(behaviorFactory) 
    { 
    } 

    protected override void Adapt(IRegion region, Panel regionTarget) 
    { 
     region.Views.CollectionChanged += (s, e) => 
       { 
        if (e.Action == NotifyCollectionChangedAction.Add) 
        { 
         foreach (FrameworkElement element in e.NewItems) 
         { 
          regionTarget.Children.Add(element); 
         } 
        } 
        else if (e.Action == NotifyCollectionChangedAction.Remove) 
        { 
         foreach (FrameworkElement CurrentElement in e.OldItems) 
          regionTarget.Children.Remove(CurrentElement); 
        } 
       }; 
    } 

    protected override IRegion CreateRegion() 
    { 
     return new AllActiveRegion(); 
    } 
} 

Étape 2 - mettre à jour votre bootstrapper

public class Bootstrapper : UnityBootstrapper 
{ 
    protected override DependencyObject CreateShell() 
    { 
     ... 
    } 

    protected override IModuleCatalog GetModuleCatalog() 
    { 
     ... 
    } 

    protected override RegionAdapterMappings ConfigureRegionAdapterMappings() 
    { 
     RegionAdapterMappings Mappings = base.ConfigureRegionAdapterMappings(); 
     Mappings.RegisterMapping(typeof(Panel), Container.Resolve<PanelHostRegionAdapter>()); 
     return Mappings; 
    } 
} 
Questions connexes