Exemple #1
0
        public static void RegisterResourceDictionaryBySource(string uri, XamlParseContext context, Func <ResourceDictionary> dictionary)
        {
            _registeredDictionariesByUri[uri] = dictionary;

            if (context != null)
            {
                // We store the dictionaries inside a ResourceDictionary to utilize the lazy-loading machinery
                var assemblyDict = _registeredDictionariesByAssembly.FindOrCreate(context.AssemblyName, () => new ResourceDictionary());
                var initializer  = new ResourceDictionary.ResourceInitializer(dictionary);
                _assemblyRef++;                 // We don't actually use this key, we just need it to be unique
                assemblyDict[_assemblyRef] = initializer;
            }
        }
        public void When_LinkedResDict_ThemeUpdated()
        {
            const string TestBrush      = nameof(TestBrush);
            const string TestThemeColor = nameof(TestThemeColor);
            const string Light          = nameof(Light);
            const string Dark           = nameof(Dark);

            var theme = ResourceDictionary.GetActiveTheme();

            try
            {
                // setup
                ResourceDictionary.SetActiveTheme("Light");

                // initialize source res-dict
                var parserContext = new XamlParseContext();
                var dontcare      = new object();
                var source        = new ResourceDictionary()
                {
                    IsParsing         = true,
                    ThemeDictionaries =
                    {
                        [Light] = new WeakResourceInitializer(dontcare, that => new ResourceDictionary {
                            [TestThemeColor] = Colors.Red,
                        }),
                        [Dark] = new WeakResourceInitializer(dontcare,  that => new ResourceDictionary {
                            [TestThemeColor] = Colors.Blue,
                        }),
                    },
                    [TestBrush] = new WeakResourceInitializer(dontcare, that =>
                    {
                        var brush = new SolidColorBrush();
                        ResourceResolverSingleton.Instance.ApplyResource(brush, SolidColorBrush.ColorProperty, TestThemeColor, true, parserContext);

                        return(brush);
                    })
                };
                source.CreationComplete();

                // making a copy from source
                var copy = new ResourceDictionary();
                copy.CopyFrom(source);

                // retrieve the "TestBrush" from each res-dict while also materializing it in both the source and in the copy
                var materialized1      = (SolidColorBrush)source[TestBrush];
                var materialized2      = (SolidColorBrush)copy[TestBrush];
                var materialized2Color = materialized2.Color;

                // set active theme and update the copy res-dict
                ResourceDictionary.SetActiveTheme(Dark);
                copy.UpdateThemeBindings(Windows.UI.Xaml.Data.ResourceUpdateReason.ThemeResource);

                // retrieve the "TestBrush" again from each res-dict
                var materialized3 = (SolidColorBrush)source[TestBrush];
                var materialized4 = (SolidColorBrush)copy[TestBrush];

                // validation
                Assert.AreEqual(false, ReferenceEquals(materialized1, materialized2));     // we are expecting these to be different, as the CopyFrom should copy them as WeakResourceInitializer...
                Assert.AreEqual(false, ReferenceEquals(materialized3, materialized4));     // ^same
                Assert.AreNotEqual(materialized2Color, materialized4.Color);               // check the theme change is actually applied (otherwise it would void the next check)
                Assert.AreEqual(materialized3.Color, materialized4.Color);                 // check the theme change is propagated to the source res-dict
            }
            finally
            {
                // clean up
                ResourceDictionary.SetActiveTheme(theme);
            }
        }