public IEnumerable <object> GetViewsWithNamePrefix(string viewNamePrefix) { // just to check the parameter and throw the correct exception message obtained from the superclass resources. object dummy = GetView(viewNamePrefix); return(ItemMetadataCollection.Where(x => x.Name.StartsWith(viewNamePrefix)).Select(metadata => metadata.Item)); }
/// <summary> /// Removes the specified view from the region. /// </summary> /// <param name="view">The view to remove.</param> public virtual void Remove(object view) { ItemMetadata itemMetadata = GetItemMetadataOrThrow(view); ItemMetadataCollection.Remove(itemMetadata); DependencyObject dependencyObject = view as DependencyObject; if (dependencyObject != null && Regions.RegionManager.GetRegionManager(dependencyObject) == this.RegionManager) { dependencyObject.ClearValue(Regions.RegionManager.RegionManagerProperty); } }
/// <summary> /// Returns the view instance that was added to the region using a specific name. /// </summary> /// <param name="viewName">The name used when adding the view to the region.</param> /// <returns>Returns the named view or <see langword="null"/> if the view with <paramref name="viewName"/> does not exist in the current region.</returns> public virtual object GetView(string viewName) { if (string.IsNullOrEmpty(viewName)) { throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, Resources.StringCannotBeNullOrEmpty, "viewName")); } ItemMetadata metadata = ItemMetadataCollection.FirstOrDefault(x => x.Name == viewName); if (metadata != null) { return(metadata.Item); } return(null); }
private void ItemMetadataCollectionInsert(int index, PreferredPositionItemMetadata itemMetadata) { var nToKeep = index; // left var nToRemove = ItemMetadataCollection.Count - nToKeep; // right Debug.Assert(ItemMetadataCollection.Count == nToRemove + nToKeep); var backup = new List <ItemMetadata>(nToRemove); backup.AddRange(ItemMetadataCollection.Skip(nToKeep)); // save the left part for (int i = 1; i <= nToRemove; i++) // remove the right part { ItemMetadataCollection.RemoveAt(ItemMetadataCollection.Count - 1); // remove last view } ItemMetadataCollection.Add(itemMetadata); // append after the left part ItemMetadataCollection.AddRange(backup); // restore the right part }
private void InnerAdd(PreferredPositionNamedView namedview, IRegionManager scopedRegionManager) { object view = (namedview.m_viewInstance ?? namedview.m_viewInstanceProvider()); if (this.ItemMetadataCollection.FirstOrDefault(x => x.Item == view) != null) { throw new InvalidOperationException("RegionViewExistsException"); } PreferredPositionItemMetadata itemMetadata = new PreferredPositionItemMetadata(view); if (!string.IsNullOrEmpty(namedview.m_viewName)) { if (this.ItemMetadataCollection.FirstOrDefault(x => x.Name == namedview.m_viewName) != null) { throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "RegionViewNameExistsException: {0}", namedview.m_viewName)); } itemMetadata.Name = namedview.m_viewName; } itemMetadata.PreferredPosition = namedview.m_viewPreferredPosition; DependencyObject dependencyObject = view as DependencyObject; if (dependencyObject != null) { Microsoft.Practices.Composite.Presentation.Regions.RegionManager.SetRegionManager(dependencyObject, scopedRegionManager); } #if true || DEBUG if (MARK_PREFERRED_POS) { markWithAddIndex(itemMetadata); } #endif int initialCount = ItemMetadataCollection.Count; bool isSeparator = itemMetadata.Item is Separator #if true || DEBUG || MARK_PREFERRED_POS && !(itemMetadata.Item is MenuItemRichCommand) && itemMetadata.Item is MenuItem #endif ; switch (itemMetadata.PreferredPosition) { case PreferredPosition.First: { var lastItemWithFirstPreferredPosition = ItemMetadataCollection.LastOrDefault(item => { var positionedItem = item as PreferredPositionItemMetadata; if (positionedItem == null) { Debug.Fail(@"This should never happen !! (not a PreferredPositionItemMetadata in PreferredPositionRegion)"); return(false); } return(positionedItem.PreferredPosition == PreferredPosition.First); }); // No First in the current list of views for this region if (lastItemWithFirstPreferredPosition == null) { if (isSeparator) { break; // the following views will be inserted as the very first ones, no need for separation } if (ItemMetadataCollection.Count == 0) { ItemMetadataCollection.Add(itemMetadata); #if true || DEBUG if (MARK_PREFERRED_POS) { ItemMetadataCollectionCheckPreferredPositions(); } #endif } else { //ItemMetadataCollection.Insert(0, itemMetadata); //ItemMetadataCollectionInsert(0, itemMetadata); var backup = new List <ItemMetadata>(initialCount); while (ItemMetadataCollection.Count > 0) { var toRemove = ItemMetadataCollection.First(); ItemMetadataCollection.Remove(toRemove); backup.Add(toRemove); } ItemMetadataCollection.Add(itemMetadata); ItemMetadataCollection.AddRange(backup); #if true || DEBUG if (MARK_PREFERRED_POS) { ItemMetadataCollectionCheckPreferredPositions(); } #endif } Debug.Assert(ItemMetadataCollection.Count == initialCount + 1); } else // we found the last view with position == First { int index = ItemMetadataCollection.IndexOf(lastItemWithFirstPreferredPosition); // All the current views are First, so we append the new view (note: could be a Separator) // i.e. the first view to be registered as First is guaranteed to take precedence over the ones that come after. if (index == ItemMetadataCollection.Count - 1) { ItemMetadataCollection.Add(itemMetadata); #if true || DEBUG if (MARK_PREFERRED_POS) { ItemMetadataCollectionCheckPreferredPositions(); } #endif } else // there are Any or Last views after the last First one. { //ItemMetadataCollection.Insert(index + 1, itemMetadata); ItemMetadataCollectionInsert(index + 1, itemMetadata); #if true || DEBUG if (MARK_PREFERRED_POS) { ItemMetadataCollectionCheckPreferredPositions(); } #endif } Debug.Assert(ItemMetadataCollection.Count == initialCount + 1); } break; } case PreferredPosition.Last: { var lastItemWithLastPreferredPosition = ItemMetadataCollection.LastOrDefault(item => { var positionedItem = item as PreferredPositionItemMetadata; if (positionedItem == null) { Debug.Fail(@"This should never happen !! (not a PreferredPositionItemMetadata in PreferredPositionRegion)"); return(false); } return(positionedItem.PreferredPosition == PreferredPosition.Last); }); // No Last in the current list of views for this region if (lastItemWithLastPreferredPosition == null) { ItemMetadataCollection.Add(itemMetadata); // could be a separator #if true || DEBUG if (MARK_PREFERRED_POS) { ItemMetadataCollectionCheckPreferredPositions(); } #endif } else // we found the last view with position == Last { int index = ItemMetadataCollection.IndexOf(lastItemWithLastPreferredPosition); if (index == ItemMetadataCollection.Count - 1) { ItemMetadataCollection.Add(itemMetadata); // could be a separator #if true || DEBUG if (MARK_PREFERRED_POS) { ItemMetadataCollectionCheckPreferredPositions(); } #endif } else { Debug.Fail("No First or Any should follow a Last !!"); ////ItemMetadataCollection.Insert(index + 1, itemMetadata); //ItemMetadataCollectionInsert(index + 1, itemMetadata); } } Debug.Assert(ItemMetadataCollection.Count == initialCount + 1); break; } case PreferredPosition.Any: { var firstItemWithLastPreferredPosition = ItemMetadataCollection.FirstOrDefault(item => { var positionedItem = item as PreferredPositionItemMetadata; if (positionedItem == null) { Debug.Fail(@"This should never happen !! (not a PreferredPositionItemMetadata in PreferredPositionRegion)"); return(false); } return(positionedItem.PreferredPosition == PreferredPosition.Last); }); // No Last in the current list of views for this region if (firstItemWithLastPreferredPosition == null) { ItemMetadataCollection.Add(itemMetadata); // could be a separator #if true || DEBUG if (MARK_PREFERRED_POS) { ItemMetadataCollectionCheckPreferredPositions(); } #endif } else { int index = ItemMetadataCollection.IndexOf(firstItemWithLastPreferredPosition); // ItemMetadataCollection.Insert(index, itemMetadata); ItemMetadataCollectionInsert(index, itemMetadata); #if true || DEBUG if (MARK_PREFERRED_POS) { ItemMetadataCollectionCheckPreferredPositions(); } #endif } break; } } }