2016-01-05 1 views
0

J'ai une application qui enregistre 2 régions avec le gestionnaire de région, 1 est un contrôle de contenu et l'autre un contrôle personnalisé. Les deux sont très bien lors de l'exécution de l'application jusqu'à ce que j'essaie d'utiliser une session RDP. Si je déconnecte de l'ordinateur distant exécutant l'application, puis reconnectez le RDP avec l'application en cours d'exécution, j'obtiens une exception que le contrôle personnalisé est déjà enregistré. Les deux ont le paramètre RegionMeneberLifetime défini sur false.Prism Regions UpdateRegionsException

Le contrôle de contenu est ajouté 1er comme

<ContentControl x:Name="MainRegion" Panel.ZIndex="0" 
regions:RegionManager.RegionName="{x:Static sharedInterfaces:RegionNames.MainWorkspaceRegion}" 
regions:RegionManager.RegionManager="{Binding RegionManager}"/> 

et le contrôle personnalisé

<controls:PopUpContainer regions:RegionManager.RegionName="{x:Static sharedInterfaces:RegionNames.PopupRegion}" 
           regions:RegionManager.RegionManager="{Binding RegionManager}"/> 

Le contrôle de inherits personnalisés de ContentControl.

L'exception est lancée

Message: Une exception est survenue lors de la création d'une région avec le nom 'MainWorkspaceRegion'. L'exception était: Microsoft.Practices.Prism.Regions.UpdateRegionsException: une exception s'est produite lors de la tentative de création d'objets région. - L'exception provoquant le plus probablement était: 'System.Reflection.TargetInvocationException: Une exception a été émise par la cible d'un appel. ---> Microsoft.Practices.Prism.Regions.Behaviors.RegionCreationException: Une exception s'est produite lors de la création d'une région avec le nom 'PopupRegion'. L'exception était: System.ArgumentException: La région avec le nom donné est déjà enregistrée: PopupRegion

Il semble que la popup n'a pas été supprimée et en essayant de l'ajouter, elle explose. Des suggestions sur la façon dont je peux gérer cela?

Répondre

0

trouvé un travail autour. La vue n'enregistre pas les contrôles avec le gestionnaire de régions il est fait dans le code derrière.

La vue ajoute les commandes et leur donne un nom

<ContentControl x:Name="MainRegion" Panel.ZIndex="0"/> 
<controls:PopUpContainer x:Name="PopupControl" Grid.ColumnSpan="2"/> 

Le code ajoute derrière les régions lors d'un événement de changement datacontext se produit

private void ShellView_OnDataContextChanged(object sender, DependencyPropertyChangedEventArgs e) 
    { 
     var dataContext = DataContext as ShellViewModel; 

     if (dataContext != null) 
     { 
      if (dataContext.RegionManager.Regions.ContainsRegionWithName(RegionNames.PopupRegion)) 
      { 
       dataContext.RegionManager.Regions.Remove(RegionNames.PopupRegion); 
      } 

      RegionManager.SetRegionName(PopupControl, RegionNames.PopupRegion); 
      RegionManager.SetRegionManager(PopupControl, dataContext.RegionManager); 


      if (dataContext.RegionManager.Regions.ContainsRegionWithName(RegionNames.MainWorkspaceRegion)) 
      { 
       dataContext.RegionManager.Regions.Remove(RegionNames.MainWorkspaceRegion); 
      } 

      RegionManager.SetRegionName(MainRegion, RegionNames.MainWorkspaceRegion); 
      RegionManager.SetRegionManager(MainRegion, dataContext.RegionManager); 

     } 

}

1

Soyez shure ajouter

regions:RegionManager.RegionName="{x:Static sharedInterfaces:RegionNames.PopupRegion} 

juste une fois dans l'ensemble de l'application.

Si vous avez 2 régions avec le même nom, vous obtiendrez cette exception.

(j'ai pas assez réputation commentaire)

+0

Merci pour vos commentaires, mais ce qui est déjà dans le code que vous pouvez voir dans le 2ème extrait de code « DWatson

+0

@DWatson Je sais, peut-être que vous n'avez peut-être pas publié tout votre code, mais il se peut que d'autres personnes (comme moi) soient aidées par cette information. –