public static IEnumerable <ImageSetTarget> FindTargets(this ImageSetTarget root, SizeConstraintData constraint)
        {
            var result = root.Children
                         .Where(x => x.ImageType == constraint.ImageType)
                         .SelectMany(x => x.Children)
                         .Where(x => string.IsNullOrEmpty(constraint.QualifierName) &&
                                x.Children.Count == 0 ||
                                x.QualifierName == constraint.QualifierName)
                         .SelectMany(x => x.Children.Count == 0 ? new[] { x } : x.Children);

            return(result);
        }
        private static void UpdatePaddings(ImageSetTarget imageSetTarget, SizeConstraintData changedConstraint)
        {
            var targets = imageSetTarget.FindTargets(changedConstraint);

            foreach (var target in targets)
            {
                var sizeConstraint = target.Constraints.OfType <SizeConstraint>().ToArray();

                foreach (var constraint in sizeConstraint)
                {
                    constraint.UpdatePadding(changedConstraint);
                }
            }
        }
        private static void ManifestDesignerUserControl_Loaded(object sender)
        {
            var imageSetViewModel = _imageSetViewModel = (ImageSetViewModel)Exposed.From(sender).imageSetViewModel;

            if (imageSetViewModel == null)
            {
                return;
            }

            var visualAssetsControl = (FrameworkElement)Exposed.From(sender).visualAssetsControl;

            if (!visualAssetsControl.IsLoaded)
            {
                visualAssetsControl.Loaded -= VisualAssetsControl_Loaded;
                visualAssetsControl.Loaded += VisualAssetsControl_Loaded;
            }

            var imageSetModel = Exposed.From(sender).imageSetModel;

            var imageSetTargetViewModels = (IList <ImageSetTargetViewModel>)imageSetViewModel.ImageTypeTargets;

            _imageSetTarget = (ImageSetTarget)imageSetModel.Root;

            var imageGenerator = Exposed.From(imageSetModel).imageGenerator;

            if (imageGenerator.GetType().Name == "IImageGeneratorProxy")
            {
                return;
            }

            var imageGeneratorInterface = typeof(IImageConstraint).Assembly
                                          .GetTypes()
                                          .First(x => x.Name == "IImageGenerator");

            var imageGeneratorProxy = new ProxyGenerator().CreateInterfaceProxyWithTarget(imageGeneratorInterface,
                                                                                          imageGenerator,
                                                                                          new ImageGeneratorInterceptor());

            var imageGeneratorField = typeof(ImageSetModel).GetField("imageGenerator", BindingFlags.Instance | BindingFlags.NonPublic);

            imageGeneratorField.SetValue(imageSetModel, imageGeneratorProxy);

            var filePicker = (IFilePicker)Exposed.From(imageSetModel).filePicker;

            if (filePicker.GetType().Name == "IFilePickerProxy")
            {
                return;
            }

            imageSetTargetViewModels.Single(x => x.ImageType == null).PropertyChanged += ImageSetTargetViewModel_PropertyChanged;
            imageSetViewModel.PropertyChanged += ImageSetViewModel_PropertyChanged;

            var proxy = (IFilePicker) new ProxyGenerator().CreateInterfaceProxyWithTarget(typeof(IFilePicker),
                                                                                          filePicker,
                                                                                          new DialogFilterInterceptor());

            var filePickerField = typeof(ImageSetModel).GetField("filePicker", BindingFlags.Instance | BindingFlags.NonPublic);

            if (filePickerField == null)
            {
                return;
            }

            filePickerField.SetValue(imageSetModel, proxy);

            var imageReaderFactory = Exposed.From(imageGenerator).imageReaderFactory;

            if (!(Exposed.From(imageReaderFactory).imageReaders is IDictionary readers))
            {
                return;
            }

            var formatsToAdd = MagickImageReader.SupportedFormats
                               .Except(readers.Keys.OfType <string>())
                               .ToArray();

            if (formatsToAdd.Any())
            {
                var type = typeof(IImageConstraint).Assembly
                           .GetTypes()
                           .First(x => x.Name == "IImageReader");                         //.GetType($"{assembly.GetName().Name}.IImageReader");


                var wrapper = DelegateWrapper.WrapAs((Func <string, IEnumerable <IImageConstraint>, Task <Image> >)MagickImageReader.LoadAsync,
                                                     (Func <string, IEnumerable <IImageConstraint>, Task <Stream> >)MagickImageReader.LoadStreamAsync,
                                                     (Func <IEnumerable <string> >)(() => formatsToAdd),
                                                     new DelegateWrapper.MethodByNameAndEnumReturnType("get_ImageGraphicsType", "ImageGraphicsType", "Vector"),
                                                     type);

                foreach (var format in formatsToAdd)
                {
                    readers.Add(format, wrapper);
                }
            }

            var imageReaderFactoryField = Exposed.From(imageSetTargetViewModels.First()).previewImageLoader
                                          ?.GetType()
                                          .GetField("imageReaderFactory", BindingFlags.Instance | BindingFlags.NonPublic);

            if (imageReaderFactoryField == null)
            {
                return;
            }

            foreach (var imageSetTargetViewModel in imageSetTargetViewModels)
            {
                var exposedModel       = Exposed.From(imageSetTargetViewModel);
                var previewImageLoader = exposedModel.previewImageLoader;
                imageReaderFactoryField.SetValue(previewImageLoader, imageReaderFactory);
                if (!string.IsNullOrEmpty(exposedModel.SourceText) &&
                    formatsToAdd.Any(x => x.Equals(Path.GetExtension(exposedModel.SourceText), StringComparison.InvariantCultureIgnoreCase)) &&
                    exposedModel.SourceImage == null)
                {
                    ((UserControl)sender).Dispatcher.InvokeAsync(() => exposedModel.UpdateImagePreviewAsync());
                }
            }
        }