void UpdateToolTipContent(IWpfTextViewLine line) { IGlyphTextMarkerHandlerContext glyphTextMarkerHandlerContext = null; foreach (var marker in glyphTextViewMarkerService.GetSortedGlyphTextMarkers(line)) { if (glyphTextMarkerHandlerContext == null) { glyphTextMarkerHandlerContext = new GlyphTextMarkerHandlerContext(wpfTextViewHost, margin, line); } var toolTipContent = marker.Handler.GetToolTipContent(glyphTextMarkerHandlerContext, marker); if (toolTipContent != null) { Debug.Assert(toolTip == null); toolTipMarker = marker; toolTip = new ToolTip(); toolTip.SetResourceReference(FrameworkElement.StyleProperty, "GlyphTextMarkerToolTipStyle"); PopupHelper.SetScaleTransform(wpfTextViewHost.TextView, toolTip); toolTip.Content = new TextBlock { Text = toolTipContent, TextWrapping = TextWrapping.Wrap, }; toolTip.Placement = PlacementMode.Relative; toolTip.PlacementTarget = margin.VisualElement; toolTip.HorizontalOffset = 0; toolTip.VerticalOffset = toolTipLine.TextBottom - wpfTextViewHost.TextView.ViewportTop + 1; toolTip.IsOpen = true; return; } } }
void AddPopupContent(IWpfTextViewLine line, IGlyphTextMarker marker, FrameworkElement popupContent) { // We must close it or it refuses to use the new scale transform popup.IsOpen = false; popupTopViewLinePosition = wpfTextViewHost.TextView.TextViewLines.FirstVisibleLine.Start.Position; popupMarker = marker; popup.Child = popupContent; popup.Placement = PlacementMode.Relative; popup.PlacementTarget = margin.VisualElement; popup.HorizontalOffset = margin.VisualElement.Width - 1; var popupContentHeight = popupContent.Height; Debug.Assert(!double.IsNaN(popupContentHeight), "You must initialize the Height property of the popup content!"); if (double.IsNaN(popupContentHeight)) { popupContentHeight = 0; } popup.VerticalOffset = line.TextTop - wpfTextViewHost.TextView.ViewportTop + 1 - popupContentHeight; popup.Visibility = Visibility.Visible; PopupHelper.SetScaleTransform(wpfTextViewHost.TextView, popup); popup.IsOpen = true; }
public Geometry PositionAndDisplay(Geometry reservedSpace) { var spanBoundsTmp = GetVisualSpanBounds(); if (spanBoundsTmp == null || spanBoundsTmp.Value.IsEmpty) { return(null); } var spanBounds = WpfTextViewRectToScreenRect(spanBoundsTmp.Value); var desiredSize = ToScreenSize(PopupSize); var screen = new Screen(wpfTextView.VisualElement); var screenRect = screen.IsValid ? screen.DisplayRect : SystemParameters.WorkArea; Rect?popupRect = null; if ((style & PopupStyles.PositionClosest) != 0) { foreach (var pos in GetValidPositions(screenRect, reservedSpace, desiredSize, spanBounds, style)) { popupRect = GetClosest(spanBounds, popupRect, pos, style); } } else { foreach (var pos in GetValidPositions(screenRect, reservedSpace, desiredSize, spanBounds, style)) { popupRect = pos; break; } } if (popupRect == null) { return(null); } var viewRelativeRect = PopupHelper.TransformFromDevice(wpfTextView, popupRect.Value); bool isOpen = popup.IsOpen; if (!isOpen) { AddEvents(); } if (popupZoomLevel != wpfTextView.ZoomLevel) { // Must set IsOpen to false when setting a new scale transform popup.IsOpen = false; PopupHelper.SetScaleTransform(wpfTextView, popup); popupZoomLevel = wpfTextView.ZoomLevel; } if (!isOpen) { popup.Child = content; popup.Visibility = Visibility.Visible; } popup.VerticalOffset = viewRelativeRect.Top; popup.HorizontalOffset = viewRelativeRect.Left; popup.IsOpen = true; return(new RectangleGeometry(popupRect.Value)); }
Size ToScreenSize(Size size) => PopupHelper.TransformToDevice(wpfTextView, size);