public TeXCommentAdornment(
            IWpfTextView textView,
            TeXCommentTag tag,
            LineSpan lineSpan,
            double lastLineWidthWithoutStartWhiteSpaces,
            TeXCommentAdornmentState initialState,
            Action <Span> refreshTags,
            Action <bool> setIsInEditModeForAllAdornmentsInDocument,
            Action <TeXCommentTag, string> addAttribute,
            IRenderingManager renderingManager,
            IVsSettings vsSettings)
        {
            ExtensionSettings.Instance.CustomZoomChanged += CustomZoomChanged;
            textView.Caret.PositionChanged += Caret_PositionChanged;

            this.DataTag     = tag;
            this.refreshTags = refreshTags;
            this.setIsInEditModeForAllAdornmentsInDocument = setIsInEditModeForAllAdornmentsInDocument;
            this.addAttribute = addAttribute;
            this.textView     = textView;
            this.lastLineWidthWithoutStartWhiteSpaces = lastLineWidthWithoutStartWhiteSpaces;
            this.renderingManager = renderingManager;
            VsSettings            = vsSettings;
            ResourcesManager      = ResourcesManager.GetOrCreate(textView);
            LineSpan = lineSpan;

            InitializeComponent();

            previewAdorner = new PreviewAdorner(this, ResourcesManager, vsSettings);
            Loaded        += (s, e) =>
            {
                if (previewAdorner.Parent == null)
                {
                    previewAdorner.OffsetX = -this.lastLineWidthWithoutStartWhiteSpaces; //'this' is important because of lambda closure
                    System.Windows.Documents.AdornerLayer.GetAdornerLayer(this).Add(previewAdorner);
                }
            };

            //for correctly working binding
            NameScope.SetNameScope(btnShow.ContextMenu, NameScope.GetNameScope(this));
            NameScope.SetNameScope(btnEdit.ContextMenu, NameScope.GetNameScope(this));
            NameScope.SetNameScope((ToolTip)imgError.ToolTip, NameScope.GetNameScope(this));

            CurrentState = initialState;
        }
        public PreviewAdorner(UIElement adornedElement, IResourcesManager resourcesManager, IVsSettings vsSettings)
            : base(adornedElement)
        {
            //content
            var panel = new StackPanel()
            {
                Orientation = Orientation.Vertical, Margin = new Thickness(6, 6, 8, 8), UseLayoutRounding = true, SnapsToDevicePixels = true
            };

            var image = new Image()
            {
                SnapsToDevicePixels = true, UseLayoutRounding = true
            };

            RenderOptions.SetBitmapScalingMode(image, BitmapScalingMode.NearestNeighbor);
            image.SetBinding(Image.SourceProperty, new Binding(nameof(TeXCommentAdornment.RenderedImage))
            {
                Source = adornedElement
            });
            image.SetBinding(Image.WidthProperty, new Binding(nameof(TeXCommentAdornment.RenderedImageWidth))
            {
                Source = adornedElement
            });
            image.SetBinding(Image.HeightProperty, new Binding(nameof(TeXCommentAdornment.RenderedImageHeight))
            {
                Source = adornedElement
            });

            //var style = new Style(typeof(Image));
            //var grayscaleTrigger = new DataTrigger()
            //{
            //    Binding = new Binding(nameof(TeXCommentAdornment.CurrentState)) { Source = adornedElement },
            //    Value = TeXCommentAdornmentState.EditingAndRenderingPreview
            //};
            //grayscaleTrigger.Setters.Add(new Setter(Image.EffectProperty, graycaleEffect));
            //style.Triggers.Add(grayscaleTrigger);
            //image.Style = style;

            var textBlock = new TextBlock()
            {
                Text = "Preview:", Margin = new Thickness(0, 0, 0, 2)
            };

            textBlock.SetBinding(TextBlock.ForegroundProperty, new Binding(nameof(IResourcesManager.ForegroundUI))
            {
                Source = resourcesManager
            });
            panel.Children.Add(textBlock);
            panel.Children.Add(image);

            var border = new Border()
            {
                BorderThickness = new Thickness(1), Child = panel
            };

            border.SetBinding(Border.BorderBrushProperty, new Binding(nameof(IResourcesManager.ForegroundUI))
            {
                Source = resourcesManager
            });
            border.SetBinding(Border.BackgroundProperty, new Binding(nameof(IVsSettings.CommentsBackground))
            {
                Source = vsSettings
            });
            Child = border;

            //visibility setup
            var style = new Style(typeof(PreviewAdorner));

            style.Setters.Add(new Setter(VisibilityProperty, Visibility.Collapsed));

            var visibilityTrigger = new MultiDataTrigger();

            visibilityTrigger.Conditions.Add(new Condition(new Binding(nameof(TeXCommentAdornment.CurrentState))
            {
                Source = adornedElement
            }, TeXCommentAdornmentState.EditingWithPreview));
            visibilityTrigger.Conditions.Add(new Condition(new Binding(nameof(TeXCommentAdornment.IsCaretInsideTeXBlock))
            {
                Source = adornedElement
            }, true));
            visibilityTrigger.Setters.Add(new Setter(VisibilityProperty, Visibility.Visible));
            style.Triggers.Add(visibilityTrigger);

            visibilityTrigger = new MultiDataTrigger();
            visibilityTrigger.Conditions.Add(new Condition(new Binding(nameof(TeXCommentAdornment.CurrentState))
            {
                Source = adornedElement
            }, TeXCommentAdornmentState.EditingAndRenderingPreview));
            visibilityTrigger.Conditions.Add(new Condition(new Binding(nameof(TeXCommentAdornment.IsCaretInsideTeXBlock))
            {
                Source = adornedElement
            }, true));
            visibilityTrigger.Setters.Add(new Setter(VisibilityProperty, Visibility.Visible));
            style.Triggers.Add(visibilityTrigger);

            Style = style;
        }