Composite WPF and Merged Dictionaries

Audience

Everyone

If, like me, you like to have changeable resource files in your application. Wither it is for changing the Theme, or interchanging templates you will need to take special care when using the

libraries.

The new version of the TFS Sticky Buddy uses both!

image

I am using the built in Infragistics theme system, and the first time you select a theme I am just adding a resource file that overrides the default:

   1: Dim resourceDictionary As ResourceDictionary = ThemeManager.GetResourceSet(theme, ThemeManager.AllGroupingsLiteral)
   2: If Not resourceDictionary Is Nothing Then
   3:    Application.Current.Resources.MergedDictionaries.Add(resourceDictionary)
   4: End If

 

This causes an error in the ItemsControlRegionAdapter as WPF seams to redo the region adapters and you get a ItemsControlHasItemsSourceException. You need to change the code to the following (notice the commented out areas):

   1: /// <summary>
   2: /// Adapts an <see cref="ItemsControl"/> to an <see cref="IRegion"/>.
   3: /// </summary>
   4: /// <param name="region">The new region being used.</param>
   5: /// <param name="regionTarget">The object to adapt.</param>
   6: protected override void Adapt(IRegion region, ItemsControl regionTarget)
   7: {  //Modified by Martin Hinshelwood to allow resource file changes...
   8:     //if (regionTarget.ItemsSource != null || (BindingOperations.GetBinding(regionTarget, ItemsControl.ItemsSourceProperty) != null))
   9:     //    throw new InvalidOperationException(Resources.ItemsControlHasItemsSourceException);
  10:
  11:     //If control has child items, move them to the region and then bind control to region. Can't set ItemsSource if child items exist.
  12:     if (regionTarget.Items.Count > 0)
  13:     {
  14:         foreach (object childItem in regionTarget.Items)
  15:         {
  16:             region.Add(childItem);
  17:         }
  18:         //Control must be empty before setting ItemsSource
  19:         regionTarget.ItemsSource = null;
  20:         //regionTarget.Items.Clear();
  21:     }
  22:     regionTarget.ItemsSource = region.Views;
  23: }

 

You will notice that I had to comment out the exception for existing controls as well as the Items.Clear (which is replaced by setting the ItemsSource to nothing). This solves the problem I I have not noticed any adverse reactions.

The second problem occurs when you do you second set of the theme. at this point you need to remove the existing theme:

   1: If Not m_CurrentTheme Is Nothing Then
   2:       Application.Current.Resources.MergedDictionaries.Remove(m_CurrentTheme)
   3: End If

 

When this happens the region management is redone and you get a further RegionNameExistsException from the RegionManager. Then can be solved by changing the code in the AttachNewRegion method:

   1: /// <summary>
   2: /// Attaches a region to an object and adds it to the region manager.
   3: /// </summary>
   4: /// <param name="regionTarget">The object to adapt. This is typically a container (i.e a control).</param>
   5: /// <param name="regionName">The name of the region to register.</param>
   6: /// <exception cref="ArgumentException">When regions collection already has a region registered using <paramref name="regionName"/>.</exception>
   7: public void AttachNewRegion(object regionTarget, string regionName)
   8: {  //Modified by Martin Hinshelwood to allow resource file changes...
   9:     if (Regions.ContainsKey(regionName))
  10:         return; //throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, Resources.RegionNameExistsException, regionName));
  11:
  12:     IRegionAdapter regionAdapter = regionAdapterMappings.GetMapping(regionTarget.GetType());
  13:     IRegion region = regionAdapter.Initialize(regionTarget);
  14:
  15:     Regions.Add(regionName, region);
  16: }

 

So instead of bombing out when you try to add a region of the same name, it will just ignore it. Not ideal, but necessary.

 

Technorati Tags:

Create a conversation around this article

Share on Facebook
Share on Twitter
Share on Linkdin
Share on Redit

We dont have any dates for public classes right now. sign-up to be the first to know, or contact us for discounts or private training.

Read more
Martin Hinshelwood
As a DevOps consultant, Agile consultant, and trainer, I’ve worked with hundreds of companies to improve their software product development. It’s astonishing how many Scrum Masters lack even a basic understanding of Scrum, let alone the expertise required to support the teams they work with.A significant portion of Scrum Masters …
Martin Hinshelwood
As we progress deeper into the dynamic landscape of the 21st century, our long-established organisations, born of the Industrial Age and infused with a DNA of strict command and control, stand on shaky ground. These organisations strut with command-and-control bravado, erecting clear hierarchies in their stable inert markets where bureaucracy …
Martin Hinshelwood
In organizational development and team dynamics, Agile (as the Agile Manifesto delineates) and Scrum (as the Scrum Guide outlines) guide teams not by solving their problems but by illuminating the issues that demand attention. These frameworks aim to identify and spotlight the challenges within a team or organization’s processes, effectively …
Martin Hinshelwood
This week, I participated in a Scrum.org Webinar hosted by Sabrina Love (Scrum.org Product Owner) as well as my colleagues, Joanna Płaskonka, Ph.D. and Alex Ballarin to discuss the state of learning and how immersive learning is the future of training.You can watch the video below to hear what we …