你是我唯一的希望。我到处搜索,找不到任何可以帮助我的东西。
我为Visual Studio(2010)做了一个简单的代码标记插件。它只是找到要突出显示的部分代码(通过Regex),从找到的匹配项中创建Spans,然后为它们创建Rectangle装饰(在文本的背景中),用文本滚动。所有这些都是在view.LayoutChanged事件的实现中完成的。它工作正常......但是......不是每时候都有! 有时标记会移动各种距离(大多数向上或向下),然后在滚动文本时保持这些不正确的位置。我不知道为什么以及何时发生这种情况。我只能发现这几件事:
以下是我的代码计算位置并创建标记(LayoutChanged事件):
Geometry g = textViewLines.GetMarkerGeometry(span);
if (g != null)
{
GeometryDrawing drawing = new GeometryDrawing(_brush, _pen, g);
drawing.Freeze();
DrawingImage drawingImage = new DrawingImage(drawing);
drawingImage.Freeze();
Image image = new Image();
image.Source = drawingImage;
//Align the image with the top of the bounds of the text geometry
Canvas.SetLeft(image, g.Bounds.Left);
Canvas.SetTop(image, g.Bounds.Top);
//_layer.AddAdornment(AdornmentPositioningBehavior.TextRelative, span, null, image, null);
Rect rect = new Rect(g.Bounds.Location, g.Bounds.Size);
Rectangle marker = new Rectangle();
marker.Margin = new Thickness(rect.X - 3, rect.Y - 2, 0, 0);
marker.Width = rect.Width + 6; marker.Height = rect.Height + 4;
marker.Fill = new SolidColorBrush(mark);
marker.RadiusX = marker.RadiusY = 5;
marker.Stroke = new SolidColorBrush(color);
_layer.AddAdornment(AdornmentPositioningBehavior.TextRelative, span, null, marker, null);
}
这基本上是用于创建装饰的MSDN示例,我在这里没有任何魔力。
请帮忙!
答案 0 :(得分:0)
我遇到了同样的问题。如果你使用
_layer.AddAdornment(AdornmentPositioningBehavior.TextRelative,...);
一旦你必须插入
Canvas.SetLeft(image, g.Bounds.Left);
Canvas.SetTop(image, g.Bounds.Top);
每次都是。
答案 1 :(得分:0)
我刚刚度过了一整天的类似问题。
除了跨度移动问题外,还有很多无证的角落案例。更糟糕的是,似乎有待证明的解决方案往往会打破从未VS版本(特别是从roslyn和VS2015开始)。我最喜欢的是以下内容:如果您在多行注释中多次输入,则会偶尔删除装饰品。热闹!
所以,唯一可行的方法如下:不要试图超越VS编辑器,无论如何它都会欺骗你。
相反,从roslyn的AdornmentManager<T>
借用代码。它包含了许多我不得不重新发明的黑客攻击,甚至还有更多我从未怀疑过的黑客攻击,但它确实有效。您需要做的就是替换下面的代码
// add the visual to the adornment layer.
与你的一个(该部分是重构为可覆盖方法的良好候选者)。
P.S。我知道我有点迟到了:)希望这会节省一些时间给另一个可怜的灵魂。